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

poj2513

时间:2015-08-18 14:09:02      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

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

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47750653

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