poj2513

链接:点击打开链接

题意:一堆木棍左右两端涂有颜色,相同颜色的可以连接在一起,问所有木棍能否都连上,输入到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;
}

你可能感兴趣的:(poj2513)