百度空间 | 百度首页 
 
查看文章
 
POJ2513 Colored Sticks —— Trie树 + 并查集
2007-10-22 18:52

POJ2513 Colored Sticks

这道题需要判断图的连通性和欧拉回路,我的程序用了并查集判断图的连通性,用Trie树(用Hash效果也不错)统计单词出现次数,即统计的顶点的度数以此判断该图是否存在欧拉回路。

#include<iostream>

using namespace std;

#define N 500010

struct Node

{

   int id;

   Node *p[26];

   Node()

   {

      int i;

      id=-1;

      for (i=0;i<26;i++)

        p[i]=NULL;

   }

}root;

int d[N],parent[N],rank[N],cnt;

int GetNum(char *s)

{

   int i;

   Node *r=&root;

   for (i=0;s[i];i++)

   {

      if (r->p[s[i]-'a']==NULL)

        r->p[s[i]-'a']=new Node();

      r=r->p[s[i]-'a'];

   }

   if (r->id==-1)

      r->id=cnt++;

   return r->id;

}

int FindSet(int i)

{

   if (parent[i]!=i)

      parent[i]=FindSet(parent[i]);

   return parent[i];

}

int UnionSet(int i,int j)

{

   i=FindSet(i);

   j=FindSet(j);

   if (i!=j)

      if (rank[i]>rank[j])

        parent[j]=i;

      else

      {

        parent[i]=j;

        if (rank[i]==rank[j])

           ++rank[j];

      }

   return i!=j;

}

int main()

{

   int i,j,k;

   char s1[12],s2[12];

   for (i=0;i<N;i++)

      parent[i]=i;

   cnt=0;

   memset(rank,0,sizeof(rank));

   memset(d,0,sizeof(d));

   while (scanf("%s%s",s1,s2)!=EOF)

   {

      j=GetNum(s1);

      k=GetNum(s2);

      d[j]++;

      d[k]++;

      UnionSet(j,k);

   }

   for (k=i=0;i<cnt;i++)

      if (d[i]%2)

        k++;

   j=FindSet(0);

   for (i=1;i<cnt;i++)

      if (FindSet(i)!=j)

      {

        printf("Impossible\n");

        return 0;

      }

   if (k<3)

      printf("Possible\n");

   else

      printf("Impossible\n");

   return 0;

}


类别:Data Structures | 添加到搜藏 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
2
2008-04-10 20:19 | 回复
呵呵呵 我也过了, 不过思路是和你的差不多, 呵呵 , 加油呀,我一开始的时候,数组开小了,结果RE 呵呵呵,过了 高兴
 
3
2008-08-14 17:22 | 回复
嗯...谢谢大牛的代码!
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu