读书人

Catenyms poj hoj 欧拉回路输去路径

发布时间: 2012-10-20 14:12:48 作者: rapoo

Catenyms poj hoj 欧拉回路输出路径

#include <stdio.h>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=1001;struct edge{    int to,next;} e[10005];struct word{    char s[25];} word[maxn];bool vis[maxn],used[27];int head[maxn],in[27],out[27],f[27];char ans[maxn][30];int n,top,t;void add(int i,int j){    e[t].to=j;    e[t].next=head[i];    head[i]=t++;}int cmp(struct word a,struct word b){    return strcmp(a.s,b.s)>=0;}int find(int x){    if(x!=f[x])        f[x]=find(f[x]);    return f[x];}void un(int x,int y){    x=find(x);    y=find(y);    if(x==y) return ;    f[y]=x;}int judge(){    int num=0,cnt1=0,cnt2=0,id=-1;    for(int i=0; i<26; i++)    {        if(!used[i]) continue;        if(find(i)==i) num++;        if(in[i]!=out[i])        {            if(in[i]==out[i]+1) cnt1++;            else if(out[i]==in[i]+1) cnt2++,id=i;            else return -1;        }    }    if(num!=1) return -1;    if(!((cnt1==1&&cnt2==1)||(cnt1==0&&cnt2==0)))        return -1;    if(id==-1)    {        for(int i=0; i<26; i++)            if(out[i]>0)            {                id=i;                break;            }    }    return id;}void eular(int u,int id){    for(int i=head[u]; i!=-1; i=e[i].next)    {        int v=e[i].to;        if(!vis[i])        {            vis[i]=true;            eular(v,i);        }    }    if(id!=-1)        strcpy(ans[top++],word[id].s);}int main(){    int test;    scanf("%d",&test);    while(test--)    {        scanf("%d",&n);        t=0;        memset(head,-1,sizeof(head));        memset(ans,0,sizeof(ans));        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        memset(used,false,sizeof(used));        memset(vis,false,sizeof(vis));        for(int i=0; i<=27; i++)            f[i]=i;        for(int i=0; i<n; i++)            scanf("%s",word[i].s);        sort(word,word+n,cmp);        for(int i=0; i<n; i++)        {            int x=word[i].s[0]-'a';            int y=word[i].s[strlen(word[i].s)-1]-'a';            add(x,y);            un(x,y);            in[y]++;            out[x]++;            used[x]=used[y]=true;        }        int s=judge();        if(s==-1) printf("***\n");        else        {            top=0;            eular(s,-1);                        for(int i=top-1; i>=0; i--)            {                printf("%s",ans[i]);                if(i!=0) printf(".");            }            printf("\n");        }    }    return 0;}

读书人网 >编程

热点推荐