poj 2513 Colored Sticks 欧拉路
2015-03-25 21:26
471 查看
水欧拉路,直接颜色离散化然后建边,或者并查集。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn=250005; struct pi{ char c[10]; }pp[maxn*2]; struct ppi{ char c[10],d[10]; }pp1[maxn]; int cmp(pi a,pi b){ return strcmp(a.c,b.c)<0; } int in[2*maxn]; int get(char *c,int n){ int le=0; int ri=n-1; int mid; while(le<=ri){ mid=(le+ri)/2; if(strcmp(pp[mid].c,c)>=0) ri=mid-1; else le=mid+1; } return le; } int pa[maxn*2]; int find(int p){ if(pa[p]==p) return p; return pa[p]=find(pa[p]); } void merg(int a,int b){ int x,y; x=find(a); y=find(b); pa[x]=y; } int main() { int i,n; n=0; while(scanf("%s%s",pp1 .c,pp1 .d)!=EOF){ strcpy(pp[2*n].c,pp1 .c); strcpy(pp[2*n+1].c, pp1 .d); n++; } /* cin>>n; for(i=0;i<n;i++){ scanf("%s%s",pp1 .c,pp1 .d); strcpy(pp[2*n].c,pp1 .c); strcpy(pp[2*n+1].c, pp1 .d); }*/ sort(pp,pp+2*n,cmp); for(i=0;i<2*n;i++) pa[i]=i; int w=0; for(i=0;i<n;i++){ int a,b; a=get(pp1[i].c,2*n); b=get(pp1[i].d,2*n); in[a]++; in[b]++; merg(a,b); w=a; } int x=0; for(i=0;i<2*n;i++){ if(in[i]%2==1) x++; } int f=0; for(i=0;i<2*n;i++){ if(in[i]!=0){ if(find(i)!=find(w)){ f=1; break; } } } if(x>2||f) printf("Impossible\n"); else printf("Possible\n"); }
相关文章推荐
- POJ 2513--Colored Sticks【字典树编号 && 并查集判连通 && 无向图欧拉路】
- POJ 2513 Colored Sticks(字典树+无向图欧拉路)
- POJ 2513 Colored Sticks【tire tree+并查集+欧拉路】
- poj2513 Colored Sticks 字典树+并查集+欧拉路
- POJ 2513 Colored Sticks (排序+并查集判断欧拉路)
- poj 2513 Colored Sticks (欧拉路+并查集+字典树)
- POJ 2513 Colored Sticks (Tire+欧拉路+并查集)
- POJ 2513 Colored Sticks 欧拉路的判断+字典树
- POJ 2513 Colored Sticks (Trie树+并查集+欧拉路)
- POJ 2513 Colored Sticks 好题 字典树+并查集+欧拉路
- POJ-2513 Colored Sticks【并查集+Trie+欧拉路】
- poj 2513 Colored Sticks (无向欧拉路+字典树)
- POJ_2513_Colored Sticks(欧拉路+字典树)
- POJ2513 Colored Sticks 欧拉路+字典树标号
- POJ 2513 Colored Sticks 欧拉路+字典树
- [poj 2513] Colored Sticks (trie+欧拉路)
- POJ 2513 Colored Sticks
- Poj 2513 Colored Sticks(字典树+欧拉回路)
- POJ 2513 Colored Sticks
- POJ 2513 Colored Sticks 并查集 + 字典树 + 欧拉回路