其实绿色有点看高了此题。
此题只需要加一个“敌人的敌人就是我的朋友”就可以了,而只要一个人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