zoukankan      html  css  js  c++  java
  • POJ2513 Colored Sticks

    Time Limit: 5000MS   Memory Limit: 128000K
    Total Submissions: 36032   Accepted: 9427

    Description

    You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?

    Input

    Input is a sequence of lines, each line contains two words, separated by spaces, giving the colors of the endpoints of one stick. A word is a sequence of lowercase letters no longer than 10 characters. There is no more than 250000 sticks.

    Output

    If the sticks can be aligned in the desired way, output a single line saying Possible, otherwise output Impossible.

    Sample Input

    blue red
    red violet
    cyan blue
    blue magenta
    magenta cyan
    

    Sample Output

    Possible

    Hint

    Huge input,scanf is recommended.

    Source

     
     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=2400;
    10 const int mxm=250010;
    11 int read(){
    12     int x=0,f=1;char ch=getchar();
    13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 int id=0;
    18 struct trie{
    19     int a[mxn][26];
    20     int end[mxn];
    21     int cnt;
    22     int hash(char s[]){
    23         int len=strlen(s);
    24         int now=1;
    25         for(int i=0;i<len;i++){
    26             if(!a[now][s[i]-'a'])a[now][s[i]-'a']=++cnt;
    27             now=a[now][s[i]-'a'];
    28         }
    29         if(!end[now])end[now]=++id;
    30         return end[now];
    31     }
    32 };
    33 trie t;
    34 //
    35 int fa[mxm];
    36 void init(int n){for(int i=1;i<=n;i++)fa[i]=i;}
    37 int find(int x){
    38     if(fa[x]==x)return x;
    39     return fa[x]=find(fa[x]);
    40 }
    41 char s[mxm][mxn];
    42 char c1[mxn],c2[mxn];
    43 int deg[mxm];
    44 int main(){
    45     int i,j;
    46     init(mxm-1);t.cnt=1;
    47     while(scanf("%s%s",c1,c2)!=EOF){
    48         int x=t.hash(c1);
    49         int y=t.hash(c2);
    50         deg[x]++;deg[y]++;
    51         x=find(x);y=find(y);
    52         if(x!=y)fa[x]=y;
    53     }
    54     int c=0;
    55     for(i=1;i<=id;i++){
    56         if(deg[i]&1)c++;
    57     }
    58     bool flag=1;
    59     if(c>2)flag=0;
    60     else{
    61         int x=find(1);
    62         for(i=2;i<=id;i++){
    63             int y=find(i);
    64             if(x!=y){
    65                 flag=0;
    66                 break;
    67             }
    68         }
    69     }
    70     if(flag)printf("Possible
    ");
    71     else printf("Impossible
    ");
    72     return 0;
    73 }
  • 相关阅读:
    微服务化之无状态化与容器化
    微服务化的不同阶段 Kubernetes 的不同玩法
    网易大数据技术沙龙
    十年•杭研技术秀 | “网易云存储服务”从0到1发展之路
    传统业务上云:跨AZ容灾架构解析
    kubernetes1.9管中窥豹-CRD概念、使用场景及实例
    浅谈 kubernetes service 那些事 (下篇)
    浅谈 kubernetes service 那些事(上篇)
    Docker容器的原理与实践(上)
    Docker容器的原理与实践 (下)
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6020444.html
Copyright © 2011-2022 走看看