题解 BOI2003【团伙】

其实绿色有点看高了此题。

此题只需要加一个“敌人的敌人就是我的朋友”就可以了,而只要一个人X与另一人Y是敌人,X就和Y的第一个敌人是朋友就可以将X弄进Y的敌人团伙,而Y的敌人将全在那个团伙中

下面是代码

#include<bits/stdc++.h>
using namespace std;
int bcj[5010];
int e[5010]; //每个人的首个敌人
int group[5001];团伙数组
int gets(int x)
{
    if (bcj[x]==x)return x;
    return bcj[x]=gets(bcj[x]);//标准的查询
}
void merge(int x,int y)
{
    bcj[gets(x)]=gets(y);//标准的合并
}
int main()
{
    int i,j,x,y,n,m,ans=0,l;
    char c;
    cin>>x>>y;
    for (i=1;i<=x;i++)
    {
        bcj[i]=i;e[i]=0;
    }
    for (i=1;i<=y;i++)
    {
    	cin>>c;
    	cin>>n>>m;
    	if (c=='F')merge(n,m);
        if (c=='E'){if (e[n]!=0)merge(m,e[n]);else e[n]=m;if (e[m]!=0)merge(n,e[m]);else e[m]=n;}
    }//如果X敌人Y还只有X一个敌人,就不牵线,把X变为Y的第一个敌人,若Y已有敌人,就牵线,Y也是同理。
    for (i=1;i<=x;i++)bcj[i]=gets(i);每个人的老大都变为总BOSS
    for (i=1;i<=x;i++)
    if (group[bcj[i]]==0)
    {
        group[bcj[i]]=1;
        ans++;
    }//判断团伙数
    cout<<ans;
    return 0;
}THE END
    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/qq_39441542/article/details/84675158
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞