连通性判断

试题描述

无向图,包含n个节点编号1至n,初始没有边。

    现在逐次向图中添加m条边,你需要在添加边之前判断该两点是否连通。

输入
第一行两个正整数n、m。
接下来m行,每行两个正整数x、y。
输出
m行,每行包含一个整数0或1,0表示添加这条边之前两个点不连通,1表示连通。
输入示例
4 5
1 2
1 3
2 3
4 4
3 4
输出示例
0
0
1
1
0
其他说明
n,m<=300000。
 1 #include <iostream>
 2 
 3 using namespace std;
 4 int f[301010];
 5 int find(int a)   //找根节点 
 6 {
 7     if(f[a]==a) return f[a];
 8     f[a]=find(f[a]);
 9     return f[a];
10 }
11 int main()
12 {
13     int n,m;
14     scanf("%d%d",&n,&m);
15     for(int i=1;i<=n;i++) f[i]=i;  //初始化 
16     for(int i=1;i<=m;i++)
17     {
18         int x,y;
19         scanf("%d%d",&x,&y);
20         if(find(x)==find(y)) printf("1
");   //两个点的根节点相等,说明他们连同 
21         else 
22         {
23             printf("0
");
24             f[find(x)] = find(y);  //在find的过程中,会把x这一条线全部更新为以y的根节点为根节点的顶点 
25         }
26     }
27     //system("pause");
28     return 0;
29 }
连通性判断
原文地址:https://www.cnblogs.com/YXY-1211/p/5709702.html