您的位置:首页 > 其它

Colored Sticks--POJ 2513

2010-07-22 21:43 295 查看
1、解题思路:字典树,并查集,欧拉通路。

2、注意事项:字典树的插入;并查集与DFS的结合;欧拉回路的判断。

3、实现方法:

#include<iostream>
#include<map>
#include<string>
using namespace std;

//用邻接表表示连接关系
struct Edge
{
int v;
Edge *nxt;
};
Edge *head[1000010];
Edge Arr[1000010];

struct Trie
{
bool IsStr;
int Id;
Trie *nxt[26];
};
Trie root,temp[1000000];

int pos,cnt,num;
bool visite[500010];

//trie树的插入
int Insert(char str[])
{
int len=strlen(str);
Trie *Current=&root;
for(int i=0;i<len;i++)
{
if(Current->nxt[str[i]-'a']==NULL)
Current->nxt[str[i]-'a']=&temp[pos++];
Current=Current->nxt[str[i]-'a'];
}
if(Current->IsStr)
return Current->Id;
Current->IsStr=true;
Current->Id=++cnt;
return Current->Id;
}

void DFS(int v)
{
Edge *w=head[v]->nxt;
visite[v]=true;
while(w)
{
if(visite[w->v]==false)
DFS(w->v);
w=w->nxt;
}
}

bool Judge()
{
int x=0;
for(int i=1;i<=cnt;i++)
{
if(visite[i]==false)
{
DFS(i);
x++;
}
if(x>1)
return false;
}
return true;
}

void Init()
{
char str1[11],str2[11];
int A1,A2;
while(scanf("%s %s",str1,str2)!=EOF)
{
A1=Insert(str1);
A2=Insert(str2);
if(head[A1]==NULL)
head[A1]=&Arr[num++];
if(head[A2]==NULL)
head[A2]=&Arr[num++];
Edge *p=head[A1],*q;
while(p)
{
q=p;p=p->nxt;
}
q->nxt=&Arr[num++];
q->nxt->v=A2;
Edge *r=head[A2],*w;
while(r)
{
w=r;r=r->nxt;
}
w->nxt=&Arr[num++];
w->nxt->v=A1;
}
}

int main()
{
int i,s,ans=0;
Init();
if(cnt==0)
cout<<"Possible"<<endl;
else
{
if(Judge())
{
for(i=1;i<=cnt;i++)
{
Edge *p=head[i];
s=-1;
while(p)
{
s++; p=p->nxt;
}
if(s%2==1)
ans++;
}
if(ans==0||ans==2)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
else
cout<<"Impossible"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: