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连起来 
        }
    }
  • 相关阅读:
    Spark的Shuffle机制
    Map Reduce的代码学习
    本地IDEA跑阿里云服务器Word Count
    HDFS的类学习和API基本操作
    本地IDEA(Windows)访问ECS服务器HBase
    本地IDEA访问ECS服务器HDFS
    阿里云ECS大数据环境搭建
    学会使用vue ui搭建项目
    用vue封装视频预览组件(手机端)
    项目中的部门使用级联选择器,编辑时初始化选中部门解决方案
  • 原文地址:https://www.cnblogs.com/wxjor/p/5713402.html
Copyright © 2011-2022 走看看