zoukankan      html  css  js  c++  java
  • poj2513- Colored Sticks 字典树+欧拉通路判断

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

    思路很容易想到就是判断欧拉通路

    预处理时用字典树将每个单词和数字对应即可

    刚开始在并查集处理的时候出错了

    代码:

      1 #include<iostream>
      2 #include<cstdlib>
      3 #include<cstdio>
      4 #include<cstring>
      5 using namespace std;
      6 int color;
      7 #define maxn 26
      8 #define MAX 500010
      9 int parent[MAX];
     10 int degree[MAX];
     11 class Trie
     12 {
     13  public:
     14    bool flag;
     15    int id;
     16    Trie *next[maxn];
     17 };
     18 Trie  *root=new Trie;
     19 void init()
     20 {
     21     memset(degree,0,sizeof(degree));//存放各个点的度数
     22     memset(parent,-1,sizeof(parent));
     23     Trie *q=root;//字典树初始化
     24     for(int i=0;i<maxn;i++)
     25      q->next[i]=NULL;
     26      q->flag=false;
     27      q->id=0;
     28 }
     29 /* 并查集构建并判断是否为连通图*/
     30 int find(int x)
     31 {
     32    if(parent[x]==-1) return x;
     33    return parent[x]= find(parent[x]);
     34 
     35 }
     36 
     37 void Union(int u,int v)
     38 {
     39    int r1=find(u);
     40    int r2=find(v);
     41 
     42    if(r1!=r2)
     43       parent[r1]=r2;
     44 }
     45 int insert(char *s)
     46 {
     47    Trie *p =root;
     48 
     49    for(int i=0; s[i]!='' ;i++)
     50    {
     51        int d=s[i]-'a';
     52 
     53        if(p->next[d]==NULL)
     54        {
     55           Trie *temp=new Trie;
     56           for(int j=0;j<maxn;j++)
     57             temp->next[j]=NULL;
     58             temp->flag=0;
     59             temp->id=0;
     60             p->next[d]=temp;
     61        }
     62        p=p->next[d];
     63 
     64   }
     65   if(p->flag)
     66     {
     67       return p->id;
     68     }
     69   else
     70    {
     71       p->flag=1;
     72       p->id=color++;
     73       return p->id;
     74    }
     75 
     76 }
     77 void del_trie(Trie * p)
     78 {
     79    for(int i=0;i<maxn;i++)
     80       if(p->next[i])
     81          del_trie(p->next[i]);
     82 
     83    free(p);
     84 }
     85 int main()
     86 {
     87    char s1[20],s2[20];
     88    init();
     89    color=0;
     90    while(scanf("%s%s",s1,s2)!=EOF)
     91    {
     92        int num1=insert(s1);
     93        int num2=insert(s2);
     94 
     95        degree[num1]++;
     96        degree[num2]++;
     97        Union(num1,num2);
     98 
     99    }
    100    int cnt1=0,cnt2=0;
    101    for(int i=0;i<color;i++)//判断是佛否含欧拉通路
    102    {
    103       if(parent[i]==-1) cnt1++;
    104       if(degree[i]%2==1) cnt2++;
    105       if(cnt1>1) break;
    106       if(cnt2>2) break;
    107    } 
    108 
    109    if((cnt1==0 || cnt1==1) &&(cnt2==0 || cnt2==2))
    110    printf("Possible
    ");
    111    else printf("Impossible
    ");
    112  //  del_trie(root);
    113    return 0;
    114    
    115 }
  • 相关阅读:
    加入mapstruct后出现 找不到符号 符号: 方法 setXX 的解决方法
    解决docker容器日志导致主机磁盘空间满了的情况
    prometheus安装(docker)
    在Github或Gitee上用hexo搭建个人博客
    解决github打不开
    jenkins更新为国内源
    让sentinel-dashboard的流控配置持久化到nacos
    Yarn和Zookeeper的区别
    flink安装启动(docker)
    jQuery 事件源码定位
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/poj2513.html
Copyright © 2011-2022 走看看