hdu1272 并查集

如果要输出yes 需要满足

1  这个图连通

2  没有回路

3  0 0 也是yes

看它有没有回路 在un的时候做一次判断就可以了

然后是判断连通 在这里采用的方法是扫一遍 如果这个点出现过就判断(用vis看是否出现) 然后如果它作为根节点 最后根节点只能是一个

和上次做欧拉用的判断连通办法不一样 上一个更省时间不过更麻烦吧..

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
int fa[100050];
int vis[100050];
bool ok;
void init()
{
    for(int i=0;i<100040;i++)
    {
        fa[i]=i;
        vis[i]=0;
    }
    ok=true;
}
int find(int i)
{
    return fa[i]==i?i:find(fa[i]);
}
void un(int a,int b)
{
    int aa=find(a);
    int bb=find(b);
    if(aa==bb)
        ok=false;
    else
        fa[aa]=bb;
    return ;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        if(a==0&&b==0)
            printf("Yes\n");
        else
        {

        if(a==-1&&b==-1)
            break;
        init();
        un(a,b);
        vis[a]=1;
        vis[b]=1;
        while(~scanf("%d%d",&a,&b))
        {
            if(a==0&&b==0)
                break;
            un(a,b);
            vis[a]=1;
            vis[b]=1;
        }
        int many=0;
        for(int i=0;i<100040;i++)
        {
            if(fa[i]==i&&vis[i]==1)
            {
                many++;
            }
        }
        if(many!=1)
            ok=false;
        if(ok==true)
            printf("Yes\n");
        else printf("No\n");
        }
    }
}

  

时间: 2024-09-30 06:52:57

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来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

小希的迷宫--hdu1272(并查集)

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

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来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

ACM-并查集之小希的迷宫——hdu1272

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24446    Accepted Submiss

HDU1272 小希的迷宫 (并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 注意问题: 1.不能成环,即每次输入的两个数的根节点不能相同: 2.只有一个迷宫,即根节点数目唯一: 3.注意当只输入"0 0" 时要输出"Yes": 4.状态压缩用递归回栈溢出. 参考代码: #include<stdio.h> int fa[100001]; int find(int u) { int s; s=u; while (fa[u]!=u)

HDU1272 小希的迷宫(基础并查集)

杭电的图论题目列表,共计500题,努力刷吧 AC 64ms #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> const int INF = 1e8; using namespace std; int father[100010]; bool vis[100010]; int findx(int r) {

并查集图冲突hdu1272

还是属于并查集的变形 两个点只有一条路径连通 给出的两个点事先都是属于两个集合的 需要给出的着条边构成一个集合 算法复杂度还是挺高的 每个我都循环了100000次 set2数组没清空 wrong了一次 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int sett[100000 + 100]; int set2[100000 + 100]; int find2(in

HDU1272:小希的迷宫(并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 67049    Accepted Submission(s): 21037 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 Description: 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也

poj1308 并查集

题意:和hdu1272差不多,只不过给出的是有向图,问图中的点是否是一颗树. 还是用并查集合并点,对于一条边,如果连接的两点已经在同一并查集内,则可以直接判否.合并时按边的方向记录点的入度,如果某个点入度大于1也就是某个点有多个父亲节点,则说明不是树.合并时顺便记录合并总次数,最后合并 点数-1 次则是树. 1 #include<stdio.h> 2 #include<string.h> 3 4 int fa[100005],num[100005]; 5 bool vi[10000