当前位置:编程学习 > C/C++ >>

rqnoj 577 团伙

终于找到这题的提交链接了,刘汝佳那本书81页有这题的的题解,不重复了。
我觉得这题思维还是很饶人的。
题目大体的说:
1.我朋友的朋友是我的朋友;
 2.我敌人的敌人是我的朋友;
所有是朋友的人组成一个团伙。告诉你关于这N个人的M条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?
用并查集来记录,其中e[i]记录i的是i的敌人组成的团伙。
[cpp]  
#include <iostream>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <math.h>  
#include <algorithm>  
#include <stack>  
#include <queue>  
#include <map>  
using namespace std;  
  
int f[1005];  
int e[1005];  
int vis[1005];  
  
int findset(int a)  
{  
    if(a == f[a])  
    {  
        return a;  
    }  
    f[a] = findset(f[a]);  
    return f[a];  
  
}  
void unionset(int a,int b)  
{  
    a = findset(a);  
    b = findset(b);  
    if(a!=b)  
    {  
        f[b] = a;  
    }  
}  
int main()  
{  
    /*#ifndef ONLINE_JUDGE 
        freopen("in.txt","r",stdin); 
    #endif*/  
    int n,m;  
    char c;  
    int a,b;  
    while(scanf(" %d %d",&n,&m)!=EOF)  
    {  
        memset(e,0,sizeof(e));  
        memset(vis,0,sizeof(vis));  
  
        for(int i=1; i<=n; i++)  
        {  
            f[i] = i;  
        }  
        for(int i=0; i<m; i++)  
        {  
            scanf(" %c %d %d",&c,&a,&b);  
            //printf("c = %c\n",c);  
            if(c == 'F')  
            {  
                unionset(a,b);  
            }  
            else if(c == 'E')  
            {  
                if(e[a] == 0)  
                {  
                    e[a] = b;  
                }  
                else  
                {  
                    unionset(e[a],b);  
                }  
                if(e[b] == 0)  
                {  
                    e[b] = a;  
                }  
                else  
                {  
                    unionset(e[b],a);  
                }  
            }  
        }  
        int sum = 0;  
        for(int i=1; i<=n; i++)  
        {  www.zzzyk.com
            int cur = findset(i);  
            if(vis[cur] == 0)  
            {  
                vis[cur] = 1;  
                sum++;  
            }  
        }  
        printf("%d\n",sum);  
    }  
    return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,