雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

无限种类并查集+离散化——pku1733(中上难度)

Posted on 2011-02-28 22:15  huhuuu  阅读(293)  评论(0编辑  收藏  举报
学习了种类并查集,又学了离散化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;
}