poj 2513 很多RE,很多WA

很多的错误,狂交了几十遍,哈哈~

最后总结如下:

RE:数组越界

WA:字母拼错

建trie树之后再加一个并查集,用来查询图是否连通以及很方便的记录每个点的度数

View Code
//runtime error 的原因:初始化的时候从1到MAX赋值,数组越界,牢记啊!!!
//WA原因: Impossible拼错。。囧!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int MAX = 500010;
class trie{
public:
bool flag;
int id;
trie* child[27];
trie()
{
flag=false;
id=0;
memset(child,0,sizeof(child));
}
}root;
int color=0;
int degree[MAX];
int p[MAX];
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
void unio(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
p[x]=y;
}
int insert(char *s)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id])
cur->child[id]=new trie;
cur=cur->child[id];
}
if(cur->flag) return cur->id;
else
{
cur->flag=true;
cur->id=++color;
return cur->id;
}
}
int main()
{
int i,j;
char s1[11],s2[11];
for(i=1;i<=500000;i++)
{
p[i]=i;
degree[i]=0;
}
while(scanf("%s%s",s1,s2)!=EOF)
{
i=insert(s1);
j=insert(s2);
degree[i]++;
degree[j]++;
unio(i,j);
}
int r=find(1);
int num=0;
for(j=1;j<=color;j++)
{
if(degree[j]%2==1) num++;
if(num>2)
{
printf("Impossible\n");
return 0;
}
if(find(j)!=r)
{
printf("Impossible\n");
return 0;
}
}
if(num==1) printf("Impossible\n");
else printf("Possible\n");
return 0;
}



你可能感兴趣的:(poj)