判断图的连通性

连通性判断

【试题描述】

无向图,包含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。

 

【试题分析】

用并查集做,这是一道全世界最水的图论题,直接不用说,上代码……

 

【代码】

#include<iostream>
using namespace std;
int x,y,f[301001],n,m;
int find(int x)  
{  
    if (f[x]==x) return f[x];  
    return f[x]=find(f[x]);  
}  
void merge(int v,int u)  
{  
     int t1,t2;  
     t1=find(v);  
     t2=find(u);  
     if(t1!=t2) f[t2]=t1;  
     return ;
}
inline int read()
{
    int x,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
    return x*f;
}
inline void write(int x)
{
    if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
    {
        bool w=false;
        x=read(),y=read();
        if(find(x)!=find(y)) w=true;//如果x和y的根一样那么就可以知道这两条边加进去以后图是连通的
        if(w==false)write(1),printf("\n"); 
        else write(0),printf("\n");
        merge(x,y);//把x和y连起来 
    }
}
posted @ 2016-07-28 08:47  wxjor  阅读(4536)  评论(0编辑  收藏  举报