zoukankan      html  css  js  c++  java
  • 判断图的连通性

    连通性判断

    【试题描述】

    无向图,包含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("
    "); 
            else write(0),printf("
    ");
            merge(x,y);//把x和y连起来 
        }
    }
  • 相关阅读:
    交易是如何被创建和打包的7
    重回js--js中的块作用域
    重回js--立即执行函数
    解决json跨域
    h5开发安卓ios坑总结
    关于html中对换行的处理
    说说display-inline
    笔记--学习git命令(基本命令版)
    写在最开始
    替换多个文件中的部分内容Demo
  • 原文地址:https://www.cnblogs.com/wxjor/p/5713402.html
Copyright © 2011-2022 走看看