码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2513 Colored Sticks

时间:2016-11-01 19:38:03      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:poi   mit   names   print   poj   http   touch   agent   sea   

 

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\n");
71     else printf("Impossible\n");
72     return 0;
73 }

 

 

POJ2513 Colored Sticks

标签:poi   mit   names   print   poj   http   touch   agent   sea   

原文地址:http://www.cnblogs.com/SilverNebula/p/6020444.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!