codevs 2597_团伙_并查集

来源:互联网 发布:c语言调用java接口 编辑:程序博客网 时间:2024/05/22 00:26

题目描述

在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:
1、 一个人的朋友的朋友是他的朋友。
2、 一个人敌人的敌人是他的朋友。
3、 一个人和他所有的朋友在同一个团伙。
4、 一个人的所有敌人是同一个团伙。
告诉你关于这n个人的m条信息(即某两人是朋友,或者某两个人是敌人),请你计算出这个城市的人最多有多少个团伙。


思路

用x+n表示敌人的敌人,每次用这个数的不是敌人的数和敌人的敌人合并就成了朋友,最后判断一下有几个集合就可

#include <stdio.h>#include <iostream>#include <string>#include <algorithm>#define max 100000using namespace std;int f[max+1],a[max+1],o[max+1][3],fl[max+1];int find(int x){    if (f[x]==x) return x;    f[x]=find(f[x]);    return f[x];}int insert(int x,int y){    if (find(x)!=find(y))    {        f[find(x)]=find(y);        return 1;    }    return 0;}int cam(int x,int y){    return x<y;}int main(){    int n,m,t=0;    scanf("%d%d",&n,&m);    for (int i=0;i<=n*2;i++)        f[i]=i;    for (int i=1;i<=m;i++)    {        char ch;        int x,y;        cin>>ch>>x>>y;        if (ch=='0')        {            insert(x,y);        }        else         {            insert(x,y+n);            insert(y,x+n);        }    }    int ans=0;    for (int i=1;i<=n;i++)        a[i]=find(f[i]);    sort(a+1,a+n+1,cam);    for (int i=1;i<=n;i++)        if (a[i]!=a[i-1]) ans++;    printf("%d\n",ans);}
0 0
原创粉丝点击