链接:点击打开链接
题意:一堆木棍左右两端涂有颜色,相同颜色的可以连接在一起,问所有木棍能否都连上,输入到EOF截止
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; struct node{ char str[20]; }s[550005],stemp[550005]; char a[20],b[20],temp[550005][20]; int fa[550005],sum[550005]; int cmp(struct node a,struct node b){ return strcmp(a.str,b.str)<0; } int binsearch(char *s,int n){ int low,high,mid; low=0;high=n-1; while(low<=high){ mid=(low+high)/2; if(strcmp(temp[mid],s)==0) return mid; else if(strcmp(temp[mid],s)>0) high=mid-1; else if(strcmp(temp[mid],s)<0) low=mid+1; } } //二分查找 int found(int x){ if(x!=fa[x]) fa[x]=found(fa[x]); return fa[x]; } int main(){ //无向欧拉回路存在的条件是图联通 int i,j,k,p,xx,yy,flag; //并且每个节点的度数都是偶数或只 i=k=0; //两个点度数为奇数 while(scanf("%s%s",a,b)!=EOF){ strcpy(s[i++].str,a); strcpy(stemp[i-1].str,a); strcpy(s[i++].str,b); strcpy(stemp[i-1].str,b); k++; } sort(s,s+i,cmp); strcpy(temp[0],s[0].str); p=1; for(j=1;j<i;j++) if(strcmp(s[j].str,s[j-1].str)!=0) strcpy(temp[p++],s[j].str); // for(j=0;j<p;j++) // cout<<temp[j]<<endl; for(j=0;j<p;j++) fa[j]=j; for(j=0;j<i;j+=2){ xx=binsearch(stemp[j].str,p); yy=binsearch(stemp[j+1].str,p); // cout<<stemp[j].str<<" "<<stemp[j+1].str<<endl; // cout<<xx<<" "<<yy<<endl; sum[xx]++;sum[yy]++; if(found(fa[xx])!=found(fa[yy])) //并查集判断图的联通 fa[found(fa[xx])]=found(fa[yy]); } flag=0; for(i=0;i<p;i++) if(fa[i]==i) flag++; if(flag>1){ //不连通时 printf("Impossible\n"); return 0; } flag=0; for(i=0;i<p;i++) if(sum[i]%2!=0) flag++; if(flag==2||flag==0) printf("Possible\n"); else printf("Impossible\n"); return 0; }