zoukankan      html  css  js  c++  java
  • 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;
    } 
    
  • 相关阅读:
    读书笔记
    STL 笔记
    Centos8如何配置网桥
    命令集合
    shared_ptr给管理的对象定制析沟函数
    share_ptr指向的对象的析构动作在创建的时候被捕获
    优秀博客
    字符串单词翻转
    带权图的最短路径算法(Dijkstra,Floyd,Bellman_ford)
    生产者与消费者 c++实现
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934523.html
Copyright © 2011-2022 走看看