您的位置:首页 > 其它

2017年上海金马五校程序设计竞赛(网上资格赛)Problem B : Coach

2017-05-26 20:42 375 查看
一开始就是考虑直接并查集,求所有的点所在的树的深度是否都是可以整除3.

#include <iostream>

#include <map>

using namespace std;

map<int,int> p;

int par[100005],r[100005],num[100005];

void init(){

 for(int i=0;i<100005;i++){

  par[i]=i;

  num[i]=1;

 }

}

int findroot(int x){

 if(par[x]==x) return x;

 else return par[x]=findroot(par[x]);

}

void unite(int x,int y){

 x=findroot(x);

 y=findroot(y);

 if(x==y){

  return;

 }

 par[y]=x;

 num[x]+=num[y];

}

int main(){

 int n,m;

 while(scanf("%d%d",&n,&m)!=EOF){

  if(m == 0) {

   printf("No\n");

   continue;

  }

  p.clear();

  init();

  int k=1;

  for(int i=0;i<m;i++){

   int a,b;

   scanf("%d%d",&a,&b);

   if(p.find(a)==p.end()){

    p[a]=k++;

   }

   if(p.find(b)==p.end()){

    p[b]=k++;

   }

   unite(p[a],p[b]);

  }

  for(int i = 1;i<=n;i++){

   if(num[findroot(p[i])]%3!=0){

    printf("No\n");

    break;

   }

   if(i==n&&num[findroot(p[i])]%3==0){

    printf("Yes\n");

   }

  }

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐