题意:有n个点,给m个两点之间得关系,问是否每个点都能到1,是输出“Yes”,并且输出每个点到1得最短路上得前一个点,否则输出“No”。
分析:对图用vector或者链式向前星进行建图,使用bfs进行遍历即可
以下为代码部分:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include <set>
#define ll long long
using namespace std;
int s[200010];
vector <int> v[200010];
int main()
{
int n,m;
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);//无向图,双向添加
}
queue<int> q;
s[1]=0;
q.push(1);
while(!q.empty())//bfs遍历一遍
{
int a=q.front();
q.pop();
for(int i=0;i<v[a].size();i++)
{
if(s[v[a][i]]==0&&v[a][i]!=1)
{
q.push(v[a][i]);
s[v[a][i]]=a;
}
}
}
int x=1;//判断是否每个点都可以走到
for(int i=2;i<=n;i++)
{
if(s[i]==0)
{
x=0;
break;
}
}
if(x)
{
cout << "Yes" << endl;
for(int i=2;i<=n;i++)
{
cout<<s[i]<<endl;
}
}
else
{
cout<<"No"<<endl;
}
return 0;
}