WA到崩溃,明天再说吧
#include<iostream>
using namespace std;
#include<vector>
int n;
typedef struct Point
{
int father;
int initfather;
int son;
int talkpoint;
int good;
};
Point point[100005];
int find(int x)
{
int r=x;
while(point[r].father!=r)
r=point[r].father;//找到他的前导结点
/*int i=x,j;
while(i!=r)//路径压缩算法
{
j=point[i].father;//记录x的前导结点
point[i].father=r;//将i的前导结点设置为r根节点
i=j;
}*/
return r;
}
void join(int x,int y)
{
int a=find(x);//x的根节点为a
int b=find(y);//y的根节点为b
if(a==x)
point[x].initfather=y;
if(a!=b)//如果a,b不是相同的根节点,则说明ab不是连通的
{
point[a].father=b;//我们将ab相连 将a的前导结点设置为b
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
vector<int>wolf;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
int temp;
char talk[10];
scanf("%d",&temp);
scanf("%s",talk);
point[i].father=i;
point[i].initfather=i;
point[i].talkpoint=temp;
if(talk[0]=='w')
point[i].good=0;
else
point[i].good=1;
}
for(i=1;i<=n;i++)
{
if(point[i].good==1)
join(i,point[i].talkpoint);
}
for(i=1;i<=n;i++)
{
if(point[i].good==0&&point[i].father==i)
if(find(point[i].talkpoint)==i)
wolf.push_back(point[i].talkpoint);
}
int ans=0;
/*for(i=1;i<=n;i++)
cout<<i<<" "<<point[i].initfather<<" "<<point[i].father<<" "<<find(i)<<endl;
cout<<endl;
for(int j=0;j<wolf.size();j++)
cout<<wolf[j]<<endl; */
for(i=1;i<=n;i++)
{
for(int j=0;j<wolf.size();j++)
if(point[i].initfather==wolf[j])
{
ans++;
continue;
}
}
printf("0 %d\n",ans+wolf.size());
}
return 0;
}