• 连通性判断


    试题描述

    无向图,包含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 }
    连通性判断
  • 相关阅读:
    把数组排成最小的数
    整数中1出现的次数
    连续子数组的最大和
    快速排序
    penCV入门
    OpenCV视频操作
    linux下导入oracle数据表
    js工作备注
    oracle创建默认表空间---重要
    oracle的导入导出
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5709702.html
Copyright © 2020-2023  润新知