您的位置:首页 > 其它

poj2513——Colored Sticks

2010-11-09 10:58 309 查看
tire树+并查集+欧拉路

将木棍端点颜色看做顶点,木棍本身作为边,利用tire树求其"顶点",用并查集来判断是否连通,而欧拉路的判断,在连通的基础上,则是每个点的度数为偶数,或者为度奇数的点只有2个!

ps:这道题为了省一个变量,然后就忘了初始化,然后就杯具了。。。不断wa

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define maxn 250005*2
typedef struct node
{
int h;
struct node * next[26];
}*tree;
tree tt;
int cnt,pre[maxn];
int num[maxn];
int getv(char a[])
{
int i=0,k;
tree p,newnode;
p=tt;
while(a[i])
{
k=a[i]-'a';
if(p->next [k]==NULL)
{
newnode=(tree)malloc(sizeof(node));
memset(newnode->next ,NULL,sizeof(newnode->next));
newnode->h =-1;
p->next[k] =newnode;
}
p=p->next[k] ;
i++;
}
if(p->h ==-1)
p->h =cnt++;
return p->h;
}
int find(int k1)
{
int x=k1;
while(x!=pre[x])
x=pre[x];
return x;
}
void uion(int f1,int f2)
{
if(f1<f2)
pre[f2]=f1;
else pre[f1]=f2;
}
int main()
{
int i,k1,k2,f1,f2;
char a[12],b[12];
for(i=0;i<maxn;i++)
pre[i]=i;
cnt=0;
memset(num,0,sizeof(num));
tt=(tree)malloc(sizeof(node));
memset(tt->next ,NULL,sizeof(tt->next ));
tt->h =-1;
while(scanf("%s%s",a,b)!=EOF)
{
k1=getv(a);
k2=getv(b);
num[k1]++;
num[k2]++;
f1=find(k1);f2=find(k2);
if(f1!=f2)
uion(f1,f2);
}
f1=0;//脑残的,这边应该重新设个变量的,以防止未初始化
for(i=0;i<cnt;i++)
if(num[i]%2!=0)
f1++;
bool flag=false;
f2=find(0);
for(i=1;i<cnt;i++)
if(find(i)!=f2)
flag=true;
if(f1>2)
{
printf("Impossible/n");
return 0;
}
else if(flag)
{
printf("Impossible/n");
return 0;
}
else
{
printf("Possible/n");
return 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: