Problem - 216B - Codeforces

題目鏈接http://codeforces.com/problemset/problem/216/B
題意:有一羣人要踢足球,但是在這些人中有幾對人存在敵對的關係,要求每個隊的人數相等並且同一個隊中不存在互爲敵對關係的人,每個人最多隻會討厭兩個人,如果a討厭b,那麼b也會討厭a,問你至少有多少人不能參加比賽。

並查集的應用:
我們先把存在敵對關係的人之間連一條邊,通過並查集把他們放在一個集合裏,每次加入一條邊時先判斷這一條邊的兩點是否已存在同一個集合裏,如果是,那麼就構成了環,注意題目所說的每個人最多隻會討厭兩個人,自己畫畫圖就知道了,對環進行0,1,染色,可知如果環裏面的人數爲奇數,那麼就需要提一個人出來,才能滿足一個隊中沒有互相討厭的人,否則就會有衝突。用總人數-奇數環的個數,如果該數爲偶數,直接輸出奇數環的個數,如果爲奇數,則要在奇數環的個數上在剔除一個人。


#define size 110
int father[110],vis[110],num[110];
int n,m,a,b;
int find(int p)
{
    return p==father[p] ? p : find(father[p]);
}        
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
       for(int i=1;i<=n;i++)
       {
          vis[i]=0;
          num[i]=1;
          father[i]=i;
       }
       int ans = 0;
       for(int i=1;i<=m;i++)
       {
          scanf("%d%d",&a,&b);
          int la = find(a);
          int lb = find(b);
          if(la==lb) vis[la] = 1,vis[lb] = 1;
          if(la!=lb) father[la]=lb,num[lb] += num[la];
       }
       for(int i = 1;i<=n;i++)
       if(father[i]==i&&vis[i]==1)
       ans += num[i]%2;
       printf("%d\n",n-(n - ans)/2*2);
   }
   return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章