HDU1272(并查集判图连通)

小希的迷宫

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 42456    Accepted Submission(s): 13078

Problem Description

上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。 

Input

输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。 
整个文件以两个-1结尾。

Output

对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。

Sample Input

6 8 5 3 5 2 6 4

5 6 0 0

8 1 7 3 6 2 8 9 7 5

7 4 7 8 7 6 0 0

3 8 6 8 6 4

5 3 5 6 5 2 0 0

-1 -1

Sample Output

Yes

Yes

No

注意:只有 0 0时输出Yes

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=100005;
int par[MAXN],vis[MAXN];
void prep()
{
    for(int i=0;i<MAXN;i++)
    {
        vis[i]=0;
        par[i]=i;
    }
}
int fnd(int x)
{
    if(par[x]==x)
    {
        return x;
    }
    return par[x]=fnd(par[x]);
}
void unite(int x,int y)
{
    int a=fnd(x);
    int b=fnd(y);
    par[a]=b;
}
bool same(int x,int y)
{
    return fnd(x)==fnd(y);
}
int main()
{
    int u,v;
    while(scanf("%d%d",&u,&v)!=EOF)
    {
        if(u==-1&&v==-1)    break;
        prep();
        int mx=0;
        if(u==0&&v==0)
        {
            printf("Yes\n");
            continue;
        }
        bool mark=true;
        do{
            mx=max(max(u,v),mx);
            vis[u]=1;
            vis[v]=1;
            if(!same(u,v))
            {
                unite(u,v);
            }
            else
            {
                mark=false;
            }
            scanf("%d%d",&u,&v);
        }while(u!=0||v!=0);
        if(mark)
        {
            int root=-1;
            int cnt=0;
            for(int i=1;i<=mx;i++)
            {
                if(vis[i])
                {
                    int fa=fnd(i);
                    if(fa!=root)
                    {
                        root=fa;
                        cnt++;
                    }
                }
            }
            if(cnt==1)
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
        else
        {
            printf("No\n");
        }
    }
    return 0;
}
时间: 2024-10-12 11:37:42

HDU1272(并查集判图连通)的相关文章

hdu1272并查集入门

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41540    Accepted Submission(s): 12811 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

HDU2120【并查集判环】

Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 600    Accepted Submission(s): 344 Problem Description ice_cream's world is a rich country, it has many fertile lands. Today,

HDU - 4514 湫湫系列故事——设计风景线(并查集判环+树形DP)

题目链接:https://vjudge.net/problem/HDU-4514 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?  其中,可以兴建的路线均是双向的,他们之间的长度均大于0. Input 测试数据有

[Gym-102346A] 偷偷偷 并查集处理图(坐标)

https://vjudge.net/problem/Gym-102346A 题意:判断监控器的范围能不能阻断左下角和右上角. 分析:利用并查集处理图,能连接起来的监控器合并起来,然后在最后标记每个集合能否连接到左下.右上.左右.上下的边界形成阻断. 注意: 每个集合可以用 find( x ) 到的祖先下标标记. #include <bits/stdc++.h> using namespace std; const int maxn = 1e5+5; const int mod=9982443

并查集-判断图的连通

来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支.如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了:如果是2个连通分支,则只要再修1条路,从两个分支中各选一个点,把它们连起来,那么所有的点都是连起来的了:如

逆向思维 + 用并查集动态维护连通块的个数——Luogu P1197题解

题目大意: 给你一个 $ n $ 个点的图与 $ m $ 条边,接下来给出一个长度为 $ k $ 个整数,按照给出整数的顺序依次删掉对应编号的点,求出一开始的连通块的个数与接下来每次删除一个点后的连通块的个数.(连通块就是一个点集,这个集合里面的任意两个点都可以互相到达) 思路: 大体思路: 这个题目如果正向考虑会很难做,因为我们要每次维护一个不断删点的图的连通块个数是很难弄的.所以我们要倒着考虑.假如我们把删点的过程倒着考虑,就变成了从最后一个点往前添加进这个图里面的过程.所以这样问题就变成了

[POJ 1308]Is It A Tree?(并查集判断图是否为一棵有根树)

Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the root, t

hdu1272 并查集

如果要输出yes 需要满足 1  这个图连通 2  没有回路 3  0 0 也是yes 看它有没有回路 在un的时候做一次判断就可以了 然后是判断连通 在这里采用的方法是扫一遍 如果这个点出现过就判断(用vis看是否出现) 然后如果它作为根节点 最后根节点只能是一个 和上次做欧拉用的判断连通办法不一样 上一个更省时间不过更麻烦吧.. #include<stdio.h> #include<string.h> #include<algorithm> #include<

HDU - 4514 湫湫系列故事——设计风景线(并查集判环)

题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度.请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少? 其中,可以兴建的路线均是双向的,他们之间的长度均大于0. 思路: 将给出的边的两个端点用并查集放在一起,如果这两个点的祖先相等说明构成了一个环. 在这个用并查