• poj 2513 Colored Sticks


    题目:http://poj.org/problem?id=2513

    这个题的题意很好懂,感觉很简单,然后交了之后wa

    后来意识到是自己的思路不正确,其实就是欧拉回路的问题

    用到了trie树+并查集+欧拉

    代码:

    View Code
      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #define max 500010
      5 using namespace std;
      6  struct node
      7 {
      8     int num;
      9     int flag;
     10     node *next[26];
     11     node()
     12     {
     13         flag=0;
     14         num=0;
     15         for(int i=0;i<=26;i++)
     16         {
     17             next[i]=NULL;
     18         }
     19     }
     20 };
     21 node *root=NULL;
     22 int set[max*2];
     23 int n=0;
     24 int find(int x)
     25 {
     26     if(x!=set[x])
     27     set[x]=find(set[x]);
     28     return set[x];
     29 }
     30 void merge(int x,int y)
     31 {
     32     x=find(x);
     33     y=find(y);
     34     if(x!=y)
     35     {
     36         set[y]=x;
     37     }
     38     return ;
     39 }
     40 int bianhao(char a[])
     41 {
     42     node *p;
     43     if(!root)
     44     {
     45         root=new node;
     46     }
     47     int len;
     48     len=strlen(a);
     49     int i;
     50     int s;
     51     p=root;
     52     for(i=0;i<len;i++)
     53     {
     54         s=a[i]-'a';
     55         if(!p->next[s])
     56         {
     57             p->next[s]=new node;
     58         }
     59         p=p->next[s];
     60     }
     61     if(p->flag)
     62     return p->num;
     63     else
     64     {
     65         n++;
     66         p->flag=1;
     67         p->num=n;
     68         return p->num;
     69     }
     70 }
     71 int main()
     72 {
     73     char str1[11],str2[11];
     74     int degree[max];//总度数
     75     int i;
     76     memset(degree,0,sizeof(degree));
     77     for(i=1;i<=max;i++)
     78     set[i]=i;
     79     while(scanf("%s %s",str1,str2)!=EOF)
     80     {
     81         int s1=bianhao(str1);
     82         int s2=bianhao(str2);
     83         degree[s1]++;
     84         degree[s2]++;
     85         merge(s1,s2);
     86     }
     87     int s=find(1);
     88     int num=0;
     89     for(i=1;i<=n;i++)
     90     {
     91         if(degree[i]%2==1)
     92         num++;
     93         if(num>2)//奇数点个数大于2肯定不是欧拉
     94         {
     95             cout<<"Impossible"<<endl;
     96             return 0;
     97         }
     98         if(find(i)!=s)//森林的情况
     99         {
    100             cout<<"Impossible"<<endl;
    101             return 0;
    102         }
    103     }
    104     if(num==1)
    105     {
    106         cout<<"Impossible"<<endl;
    107     }
    108     else//当奇数点个数是0或2时才是欧拉回路
    109     {
    110         cout<<"Possible"<<endl;
    111     }
    112 }
  • 相关阅读:
    ZendFramwork配置
    JS控制页面前进、后退
    PHP乱码
    php 文件和表单内容一起上传
    mysqli常用命令
    图解SQL多表关联查询
    mysql默认字符集修改
    mysql控制台命令
    Nanami's Digital Board

  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2871778.html
Copyright © 2020-2023  润新知