STL学习笔记vector向量数组,创建与遍历图

Posted Keep--Silent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL学习笔记vector向量数组,创建与遍历图相关的知识,希望对你有一定的参考价值。

vector向量数组,创建与遍历图

题目背景

题目:鬼谷八荒

tly最近沉迷鬼谷八荒无心学习,一上课就刷材料刷经验,玩了好几天以后看着自己密密麻麻的好友关系,他想知道每个人与自己的好感度,友好的tly认为朋友的朋友也是朋友,yly和一个人的关系越近好感度越高,比如a是b的好友,c是b的好友,那么a对b的好感度大于对c。为了方便我们用数字代替每个人的名字,tly是1。

输入格式:
第一行输入n,m,有n个人和m条关系。
题目保证关系不成环
下面m行每行输入两个数字,表示这两个人是好朋友
1<=n,m<1e4

输出格式:
按照好感度递减的顺序每行输出一种好感度对应的好友序号
如果好感度相同则序号小的先输出
如果这个n个人中存在不是tly好朋友的输出-1

输入样例:

6 5
1 2
1 3
2 4
2 5
2 6

输出样例:

1 
2 3 
4 5 6 

输入样例:

4 2
1 2
1 3

输出样例:

-1 

说明

该题所谓的亲密度=当前节点到1节点的距离 + 1,那么直接从1节点开始广度优先搜索
由于1<=n,m<1e4,使用邻接矩阵肯定会炸内存炸时间,那就使用vector向量数组(vector<int>V[10010],即V[i]下的V[i][j]代表:节点i和节点V[i][j]有连接)

代码及注释

#include<bits/stdc++.h>

using namespace std;
#define Size (10000+10)
vector<int>V[Size],ans[Size];
/*
V向量数组,代表邻接表
	即V[i]下的V[i][j]代表:节点i和节点V[i][j]有连接
ans向量数组,存放输出数据
	即ans[i]下的ans[i][j]代表:1和ans[i][j]的亲密度(距离+1)是i
*/

int flag[Size];
//flag[i]代表i节点和1的亲密度
//flag[i]=0时,代表i节点还未遍历
int main(int argc, char *argv[]) {
	int n,i,j,t,m,x,y,v,w;
	cin>>n>>m;
	for(i=0;i<m;i++){
		cin>>x>>y;
		V[y].push_back(x);//y节点和x节点有一条边
		V[x].push_back(y);//x节点和y节点有一条边
	}
	flag[1]=1;//1节点和1节点的亲密度是1 
	queue<int>q;//广度优先搜索,用队列
	q.push(1);
	while(!q.empty()){//广度优先搜索遍历整张图
		i=q.front();
		q.pop();
		for(j=0;j<V[i].size();j++){
			t=V[i][j];
			if(!flag[t]){
				flag[t]=flag[i]+1;
				q.push(t);
			}
		}
	}
	for(i=1;i<=n;i++)//把和1节点亲密度为x(flag[i])的点放入向量ans[x]中
		ans[flag[i]].push_back(i);	
	if(ans[0].size())//如果存在亲密度为0的节点,那些节点不是好友
		cout<<-1<<" "<<endl;
	else {
		for(i=1;ans[i].size();i++){//输出所有节点
			for(int j=0;j<ans[i].size();j++){
				cout<<ans[i][j]<<" ";
			}
			cout<<endl;
		}
	}
	return 0;
}

以上是关于STL学习笔记vector向量数组,创建与遍历图的主要内容,如果未能解决你的问题,请参考以下文章

ACM学习笔记:基础数据结构及STL

STL学习笔记vector与map的合用vector与vector的合用

STL中向量vector笔记

STL vector常用API

C++中STL学习笔记——容器之vector

C++中STL学习笔记——容器之vector