• Colored Sticks POJ


    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种

    方法可以使得所以棒子连在一起

    思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者只有2个奇度顶点 同时要连通   。关键在于给颜色hash和

    判断连通性   hash用字典树  连通用并查集

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=520000+20;
     6 struct Trie{
     7     int ch[maxn][26];
     8     int size;
     9     int num[maxn];
    10     int number;
    11     void init(){
    12         memset(ch,0,sizeof(ch));
    13         size=1;
    14         number=1;
    15         memset(num,0,sizeof(num));
    16     }
    17     void insert(char*s){
    18         int rc=0,i=0;
    19         for(;s[i]!='';i++){
    20             int id=s[i]-'a';
    21             if(ch[rc][id]==0){
    22                 ch[rc][id]=size++;
    23             }
    24             rc=ch[rc][id];
    25         }
    26         if(num[rc]==0)num[rc]=number++;
    27     }
    28     int find(char*s){
    29         int rc=0,i=0;
    30         for(;s[i]!='';i++){
    31             int id=s[i]-'a';
    32             if(ch[rc][id]==0){
    33                 return -1;
    34             }
    35         //    if(s[i+1]=='')return ch[rc][id];
    36             rc=ch[rc][id];
    37         }
    38         return num[rc];
    39     }
    40 }trie;
    41 int father[maxn];
    42 int Find(int x){
    43     return father[x]=father[x]==x?x:Find(father[x]);
    44 }
    45 void merge(int x,int y){
    46     x=Find(x);
    47     y=Find(y);
    48     if(x!=y)
    49     father[x]=y;
    50 }
    51 char s1[1000],s2[1000];
    52 int dgree[maxn];
    53 int main(){
    54     trie.init();
    55     int flag=0;
    56     for(int i=0;i<=maxn;i++)father[i]=i;
    57     int maxnum=0;
    58     while(scanf("%s%s",s1,s2)==2){
    59         trie.insert(s1);trie.insert(s2);
    60         int x=trie.find(s1);
    61         int y=trie.find(s2);
    62               dgree[x]++;
    63               dgree[y]++;
    64               maxnum=max(maxnum,x);
    65               maxnum=max(maxnum,y);
    66               merge(x,y);
    67     }
    68     int z=0;
    69     for(int i=1;i<=maxnum;i++){
    70         if(dgree[i]%2)z++;
    71     }
    72     flag=Find(1);
    73     int ok=1;
    74     for(int i=1;i<=maxnum;i++){
    75           if(flag!=Find(i)){
    76         //      cout<<i<<" "<<Find(i)<<" "<<flag<<endl;
    77               ok=0;break;
    78           }
    79     }
    80 //    cout<<ok<<" "<<z<<endl;
    81     if((ok)&&(z==2||z==0))printf("Possible
    ");
    82     else printf("Impossible");
    83     
    84     return 0;
    85 }
  • 相关阅读:
    ObjectQuery查询及方法
    SQL系列(十三)—— 关于表的DDL
    SQL系列(十二)—— insert update delete
    Git Push 避免用户名和密码方法
    Git系列 —— github提交一个空目录
    Git系列 —— 记一次Mac上git push时总是403的错误
    Mysql系列(三)—— Mysql主从复制配置
    SQL系列(十一)—— 函数(function)
    SQL系列(十)—— 联结(join)
    动态代理(二)—— CGLIB代理原理
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10255526.html
Copyright © 2020-2023  润新知