码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3173 Dominos

时间:2020-02-13 23:19:04      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:dom   print   std   cstring   while   const   --   namespace   hdu   

单向并查集,问至少给几个点可以遍历全图,连通块数量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\n",max(ans,ans1));
        }
    }
    return 0;
}

 

HDU3173 Dominos

标签:dom   print   std   cstring   while   const   --   namespace   hdu   

原文地址:https://www.cnblogs.com/zhanglichen/p/12305567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!