连通性判断

 

试题描述

无向图,包含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\n");   //两个点的根节点相等,说明他们连同 
21         else 
22         {
23             printf("0\n");
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值