zoukankan      html  css  js  c++  java
  • HDU3173 Dominos

    单向并查集,问至少给几个点可以遍历全图,连通块数量n,入度为0的点的数量m,取max(n,m)~

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=1e6+14;
    int father[maxn],isRoot[maxn],T,M,N,u,v,visit[maxn];
    void init () {
        for (int i=0;i<maxn;i++) father[i]=i;
        fill (isRoot,isRoot+maxn,0);
        fill (visit,visit+maxn,0);
    } 
    int findfather (int x) {
        int a=x;
        while (x!=father[x]) x=father[x];
        while (a!=father[a]) {
            int z=a;
            a=father[a];
            father[z]=x;
        }
        return x;
    }
    void Union (int a,int b) {
        int faA=findfather(a);
        int faB=findfather(b);
        if (faA!=faB) father[faA]=faB;
    }
    int main () {
        while (~scanf ("%d",&T)) {
            while (T--) {
                init ();
                scanf ("%d %d",&N,&M);
                for (int i=0;i<M;i++) {
                    scanf ("%d %d",&u,&v);
                    visit[v]=1;
                    Union (u,v);
                }
                for (int i=1;i<=N;i++) isRoot[findfather(i)]++;
                int ans=0,ans1=0;
                for (int i=1;i<=N;i++) if (isRoot[i]) ans++;
                for (int i=1;i<=N;i++) if (!visit[i]) ans1++; 
                printf ("%d
    ",max(ans,ans1));
            }
        }
        return 0;
    }
  • 相关阅读:
    第一次作业(2)
    第0次作业(2)
    最后一次作业—总结报告
    第八次作业
    第七周作业
    第六周作业
    第四周作业
    第4次作业
    2018c语言第3次作业
    2018c语言第2次作业
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12305567.html
Copyright © 2011-2022 走看看