POJ-2337-Catenyms

来源:互联网 发布:期刊论文仿真数据造假 编辑:程序博客网 时间:2024/05/15 08:15

这个题就是求欧拉路,主要就是判断能否构成欧拉同路,然后DFS一下就行了~

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<stack>using namespace std;const int maxn=1100;struct Node{    char s[30];    int len;    bool operator < (const Node &a)const    {        return strcmp(s,a.s)<0;    }}a[maxn];struct Edge{    int u;    int v;    bool is;}e[maxn];int n,st,p[maxn],in[maxn],out[maxn];stack<int> s;bool vis[30];int find(int x){    if(p[x]==-1)        return x;    return p[x]=find(p[x]);}void DFS(int x){    for(int i=0;i<n;i++)        if(!e[i].is&&e[i].u==x)        {            e[i].is=true;            DFS(e[i].v);            s.push(i);        }}bool Is(){    int cnt=0;    for(int i=0;i<26;i++)        if(vis[i]&&p[i]==-1)            cnt++;    return cnt==1;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        memset(p,-1,sizeof(p));        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)        {            scanf("%s",a[i].s);            a[i].len=strlen(a[i].s);        }        sort(a,a+n);        for(int i=0;i<n;i++)        {            int u=a[i].s[0]-'a';            int v=a[i].s[a[i].len-1]-'a';            vis[u]=vis[v]=1;            e[i].u=u;            e[i].v=v;            e[i].is=false;            in[u]++;            out[v]++;            u=find(u);            v=find(v);            if(u!=v)                p[v]=u;        }        int st=e[0].u,cnta=0,cntb=0;        bool is=true;        for(int i=0;i<26;i++)        {            if(in[i]==out[i])                continue;            else if(in[i]==out[i]+1)            {                st=i;                cnta++;            }            else if(in[i]==out[i]-1)                cntb++;            else            {                is=false;                break;            }        }        if(is&&(cnta==cntb&&(cnta==1||cnta==0))&&Is())        {            DFS(st);            printf("%s",a[s.top()].s);            s.pop();            while(!s.empty())            {                printf(".%s",a[s.top()].s);                s.pop();            }            printf("\n");        }        else            printf("***\n");    }    return 0;}


0 0
原创粉丝点击