本题关键在父节点的初始化上,应该初始化为-1,这样才能方便判断
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn=10000+100;
int par[maxn],val[maxn];
int n,m,cnt;
bool flag;
map<int,int> mp;
int Insert(int x)
{
if(!mp.count(x))
{
mp[x]=cnt++;
}
return mp[x];
}
int find(int x)
{
if(par[x]==-1)
return x;
int k=par[x];
par[x]=find(k);
val[x]=(val[k]+val[x])%2;
return par[x];
}
void init()
{
mp.clear();
flag=false;cnt=0;
memset(par,-1,sizeof(par));
memset(val,0,sizeof(val));
}
int main()
{
char s[5];int a,b,d;
//freopen("H.txt","r",stdin);
while(scanf("%d %d",&n,&m)==2)
{
//cout<<n<<m<<endl;
init();
for(int i=0;i<m;i++)
{
scanf("%d %d %s",&a,&b,&s);
if(flag) continue;
a=Insert(a-1),b=Insert(b);
int p1=find(a),p2=find(b);
if(s[0]=='e') d=0;
else d=1;
if(p1==p2)
{
if((val[a]+d)%2!=val[b])
{
//cout<<"here"<<endl;
flag=true;
printf("%d\n",i);
continue;
}
}
else
{
par[p2]=p1;
val[p2]=(val[a]-val[b]+d+2)%2;
}
}
if(!flag)
printf("%d\n",m);
}
return 0;
}