美文网首页数据结构和算法分析
HDOJ1272——判断无向图的连通性

HDOJ1272——判断无向图的连通性

作者: 周九九丶 | 来源:发表于2018-06-01 23:43 被阅读1次

题目描述

给定一个无向图,判断该图任意两点之间是否有且仅有一条路径可以相通

题目思路

  • 并查集可以维护是否属于同一组这一信息
  • 本题中如果两个点属于同一组,则说明它们连通
  • 对于输入的两个点,如果它们不在同一个组,将它们合并到同一个组
    如果它们在同一个组,说明它们之间已经有一条路径可以相通,这时又添加一条路径,所以不符合题目要求

需要注意的地方

  • 除了判断输入的两个点是否已经在一个组,还需要判断整个图是否连通。判断的方法是当点对输入完之后,判断输入的点所在组的根节点是否都一样,如果都一样,说明连通。

AC代码

#include "stdio.h"
int p[100010];//p[i] is the root of i
int r[100010];//r[i] is the depth of the tree that i is in
int f[100010];//f[i] = 1 when f is one of the input

//initial the sets
void init(){
    for(int i = 1; i < 100010; i++){
        p[i] = i;
        r[i] = 0;
        f[i] = 0;
    }
}
//Find(x) return the root of x
int Find(int x){
    if(x == p[x]) return x;
    else return p[x] = Find(p[x]);
}

//Union(x, y) union the sets of x and y
void Union(int x, int y){
    int xRoot = Find(x);
    int yRoot = Find(y);

    if(xRoot == yRoot) return;
    if(r[xRoot] < r[yRoot]) p[xRoot] = yRoot;
    else if(r[xRoot] > r[yRoot]) p[yRoot] = xRoot;
    else{
        p[yRoot] = xRoot;
        r[xRoot]++;
    }
}

bool sameRoot(int x, int y){
    return Find(x) == Find(y);
}

int main(){
    int x, y;
    init();
    int flag = 1;//flag = 1 when satisfies the requires
    while(1){
        scanf("%d %d", &x, &y);
        if(x == -1 && y == -1) return 0;
        if(x == 0 && y == 0){
            int r = 0;//root
            //judge whether the design is connected
            for(int i = 1; i < 100010; i++){
                if(f[i] == 1){
                    //if i is one of the input
                    //get the root
                    if(r == 0) r = Find(i);
                    else {
                        if(r != Find(i)) flag = 0;
                    }
                }
            }
            if(flag) printf("Yes\n");
            else printf("No\n");
            init();
            flag = 1;
            continue;
        }
        f[x] = 1;//x is one of the input
        f[y] = 1;//y is one of the input
        if(!sameRoot(x, y)) Union(x, y);
        else{
            flag = 0;
        }
    }
}

收获

  • 并查集可以判断一个图是否连通
  • 并查集可以判断一个图中两个点是否有且仅有一条路径相通

相关文章

  • HDOJ1272——判断无向图的连通性

    题目描述 给定一个无向图,判断该图任意两点之间是否有且仅有一条路径可以相通 题目思路 并查集可以维护是否属于同一组...

  • 判断无向图是否联通

    对于一个无向图来说,判断其是否联通的思路并不复杂。从任意点出发,利用深度优先搜索(DFS),若是能遍历所有的点,则...

  • 如何判断无向图是否连通

    任取两个顶点,我们都能找到一条路径从一点到达另一个点,这个图就是连通的 1.DFS法: 把一个图的所有顶点都进行一...

  • 算法与数据结构练习中常犯错误5——图论

    4.图论 4.1 无向图 4.1.1 DFS连通性与路径 51)少了index等检查 4.1.2 DFS连通分量 ...

  • 数据结构之图的基本操作

    一、判断图G是否存在边 或 (x, y) 1.1 如何判断无向图是否存在边 (C, D) ? 1.1...

  • 判断无向图和有向图是否有环

    无向图 方法1(数学方法): 图的顶点数为n,边数为m,若n>=m+1,则无环;否则有环。方法2:使用并查集进行判...

  • 图的连通性——连通性与连通块

    图的连通性 (1)路径 在无向图G中,若存在一个顶点序列Vp,V1,V2,……,Vm,Vq,使得(Vp,V1),(...

  • 图的相关算法

    深度优先搜索非递归形式 DFS 深度优先搜索非递归形式 广度优先搜索 BFS 判断无向图是否是树 判断有向图中两...

  • 如何判断无向图是否无环

    当只有一棵树的时候,节点数==边数+1时肯定无环,但是如果有多个树的时候。就要对该树单独计算节点与边数了。 使用交...

  • 无/有向图判环

    无向图寻找环的方法:(一) DFSDFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环。该算法...

网友评论

    本文标题:HDOJ1272——判断无向图的连通性

    本文链接:https://www.haomeiwen.com/subject/gbjlsftx.html