学习了种类并查集,又学了离散化STL里的map容器
这几题里比较侧重对find()函数的理解
View Code
#include<iostream>
#include<map>
using namespace std;
#define N 10005
int f[N];
int r[N];
map<int,int>mm;
int find(int pos)
{
if(f[pos]==-1)
return pos;
int t=f[pos];
f[pos]=find(f[pos]);//使f[pos]路径压缩,指向最终根节点
r[pos]=(r[pos]+r[t])%2;//r[pos]由自己与自己下一个点决定
return f[pos];
}
int un(int a,int b,int d)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)
{
if((r[a]+r[b])%2==d)return 1;
else
return 0;
}
else
{
f[fa]=fb;
r[fa]=(r[a]+r[b]+d)%2;
return 1;
}
}
int main()
{
int n,m,i;
for(i=0;i<=10000;i++)
{
f[i]=-1;
r[i]=0;
}
scanf("%d%d",&n,&m);
char str[10];
int a,b,add=0,x,y;
for(i=1;i<=m;i++)
{
scanf("%d%d%s",&a,&b,&str);
a--;
if(mm.find(a)==mm.end())
{
mm[a]=add++;
}
x=mm[a];
if(mm.find(b)==mm.end())
{
mm[b]=add++;
}
y=mm[b];
int d;
if(strcmp(str,"odd")==0)
d=1;
else
d=0;
if(un(x,y,d)==0)
{
break;
}
}
printf("%d\n",i-1);
return 0;
}