POJ

来源:互联网 发布:如何保证数据的准确性 编辑:程序博客网 时间:2024/06/06 04:14

题解:判断一下是不是欧拉路,然后按字典序加边进去,最后就是欧拉回路的模板

#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<vector>using namespace std;typedef pair<int,int> P;const int mx = 1005;int in_deg[mx];int out_deg[mx];int vis[mx];string s[mx];vector<P>g[mx];int map[mx][mx];int ans[mx];int n,m,dfn,sum;void init(){    m = dfn = sum = 0;    for(int i = 0; i < 26; i++)        g[i].clear();    memset(in_deg,0,sizeof(in_deg));    memset(out_deg,0,sizeof(out_deg));    memset(vis,0,sizeof(vis));    memset(map,0,sizeof(map));}void DFS(int u){    vis[u] = 1;    dfn++;    for(int v = 0; v < 26; v++){    //    cout<<v<<endl;        if(map[u][v]&&!vis[v])            DFS(v);    }}int check(){    for(int u = 0; u < 26; u++)        if(vis[u]){            memset(vis,0,sizeof(vis));            DFS(u);            break;        }  //  cout<<dfn<<endl;   // cout<<sum<<endl;    if(dfn!=sum)        return 1;    int so1 = 0,so2 = 0;    for(int u = 0; u < 26; u++)        if(out_deg[u]!=in_deg[u]){            if(out_deg[u]-in_deg[u]==1)                so1++;            else if(in_deg[u]-out_deg[u]==1)                so2++;            else                return 1;        }    if(so1==1&&so2==1)        return 2;    if(so1==0&&so2==0)        return 3;    return 1;}void dfs(int u,int e){    int len = g[u].size();    for(int i = 0; i < len; i++){        P v = g[u][i];        if(!vis[v.second]){            vis[v.second]=1;            dfs(v.first,v.second);        }    }    ans[++m] = e;}int main(){    int t;    scanf("%d",&t);    while(t--){        init();        scanf("%d",&n);        for(int i = 0; i < n; i++)            cin>>s[i];        sort(s,s+n);        for(int i = 0; i < n; i++){            int x = s[i][0]-'a';            int len = s[i].length();            int y = s[i][len-1]-'a';            P v;            v.first  = y;            v.second = i;            g[x].push_back(v);            in_deg[y]++;            out_deg[x]++;            if(!vis[x])                sum++,vis[x] = 1;            if(!vis[y])                sum++,vis[y] = 1;            map[x][y] = 1;            map[y][x] = 1;        }        int casei = check();        if(casei == 1)            puts("***");        else if(casei == 2){            for(int u = 0; u < 26; u++)                if(out_deg[u]>in_deg[u]){                    memset(vis,0,sizeof(vis));                    dfs(u,-1);                    break;                }            m--;            while(m>=1){                cout<<s[ans[m]];                putchar(m==1?'\n':'.');                m--;            }        }        else{            for(int u = 0; u < 26; u++)                if(out_deg[u]){                    memset(vis,0,sizeof(vis));                    dfs(u,-1);                    break;                }            m--;            while(m>=1){                cout<<s[ans[m]];                putchar(m==1?'\n':'.');                m--;            }        }    }    return 0;}
原创粉丝点击