• hdoj1272【并查集】


    因为是第二遍,所以题目也没怎么看,然后一开始的思路就是如果每次输入两个点的时候判断是不是同一个集合,如果同一个就是No,然后就wa了,想想也是,然后瞄了一下题解,还要判连通…真是蠢死了…多个集合都想不到,然后搞好以后还是wa…这次是在想不通了…然后偷瞄了代码…草泥马只有“0,0”的时候是Yes,哎,就是漏洞百出的思路,这还是得多练啊。。。

    #include<cstdio>
    #include<queue>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    #define INF 0x3f3f3f3f
    #define mod 1000000007
    #define N 100010
    
    int pre[N];
    int n;
    int flag;
    int vis[N];
    
    void init()
    {
        flag=0;
        for(int i=1;i<=N;i++)
        {
            pre[i]=i;
            vis[i]=0;
        }   
    }
    
    int Find(int x)
    {
        int r;
        r=x;
        while(pre[r]!=r)
        {
            r=pre[r];
        }
        int i=x,j;
        while(pre[i]!=r)
        {
            j=pre[i];
            pre[i]=r;
            i=j;
        }
        return r;
    }
    
    void solve(int a,int b)
    {
        a=Find(a);
        b=Find(b);
        if(a==b)
        {
            flag=1;
            return;
        }
        pre[a]=b;
    }
    
    int main()
    {
        int m;
        int T;
        int a,b;
        int Tmax,Tmin;
        while(1)
        {   
    
            Tmax=-1;
            Tmin=N;
    
            init();
            scanf("%d%d",&a,&b);
            if(a==-1&&b==-1)
                break;
            if(a==0&&b==0)
            {
                printf("Yes
    ");
                continue;
            }
            Tmax=max(Tmax,max(a,b));
            Tmin=min(Tmin,min(a,b));
            vis[a]=vis[b]=1;
            if(a==b)
                flag=1;
            pre[a]=b;
    
            while(scanf("%d%d",&a,&b))
            {
                if(!a&&!b)
                    break;
                Tmax=max(Tmax,max(a,b));
                Tmin=min(Tmin,min(a,b));
                vis[a]=vis[b]=1;
                solve(a,b);
            }
    
            if(!flag)
            {
                for(int i=Tmin;i<=Tmax;i++)
                {
                    if(pre[i]==i&&vis[i])
                        flag++;
                }
                if(flag==1)
                    puts("Yes");
                else
                    puts("No");
            }
            else
                puts("No");
        }
        return 0;
    } 
    
  • 相关阅读:
    退出窗口时出现“当”的响声
    屏幕设备环境
    修改一个完全颜色的CListCtrl类
    修改一个完全颜色的CListCtrl类
    MFC中CString.Format的详细用法
    网上阅卷系统自动识别功能代码
    mfc 子对话框数据传给父对话框
    already defined in *.obj
    Object 的使用
    this 函数执行上下文
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934523.html
Copyright © 2020-2023  润新知