STL学习笔记vector向量数组,创建与遍历图
Posted Keep--Silent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL学习笔记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向量数组,创建与遍历图的主要内容,如果未能解决你的问题,请参考以下文章