概念混淆:如果从一个顶点出发,可以通过图中的边和顶点到达任意其他顶点,则称该图为连通图,可以通过其他顶点到达,
图的遍历dfs,bfs,并查集
超级奇怪的报错,
发现了一个c语言的小问题:while(scanf读入)会TLE,当输入为一个整数时,读取到n,scanf返回值是1(表示成功读取了一个数),ok,继续执行
2. 当输入为EOF(通常切的题目有多组数据,会使用EOF表示输入结束),这时,没有读取输入到n,scanf返回值是-1,所以您的代码==1就不成立,所以会跳出循环。而如果是while(scanf(“%d”, &n))的话,即等价于while(-1),显然还会继续循环,所以超时。
可以写为while(scanf(“%d”,&n)!= EOF)
或者写为while(~scanf(“%d”,&n))
BFS做法:
选择任一点进行深度优先遍历,用一个st数组记录一个点是否被遍历过,遍历完之后,检查st数组,是否还有没有遍历过的点,如果有,则不连通,反之连通;
算法证明:dfs必然能够遍历完相互连通的图,如果遍历一遍之后仍然有点没有被遍历,说明有点不连通
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e3+10;
int p[N];
int n,m;
int find(int x){
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
}
int main(){
while(cin>>n>>m){
for(int i=1;i<=n;i++)
p[i]=i;//每个点都是自己的父节点
while(m--){
int x,y;
scanf("%d%d",&x,&y);
p[find(x)]=find(y);
}
int tmp=0;
for(int i=2;i<=n;i++)
if(find(i)!=find(1)){
tmp=1;
break;
} //全连通说明n个点均属于一个集合
if(tmp)puts("NO");
else puts("YES");
}
return 0;
}