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

poj2337欧拉回路

时间:2014-07-24 21:43:42      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   re   c   

对字符串从小到大排序,邻接表正向插入。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int maxn=2222;

int cmp(const string &a,const string &b)
{
    return a<b;
}

struct Node
{
    int to;int val;int vis;
};
string str[maxn];
vector<Node> head[maxn];
int vis[maxn];
int father[100];
void add(int from,int to,int val,int vis )
{
    Node k; k.to=to; k.val=val;k.vis=vis;
    head[from].push_back(k);
}

int getfather(int x)
{
    if(x!=father[x]) father[x]=getfather(father[x]);
    return father[x];
}

void link(int a,int b)
{
    int fa=getfather(a);int fb=getfather(b);
    father[fa]=fb;
}
stack<string >  q;
void dfs(int x)
{
    int len=head[x].size();
        for(int i=0;i<len;i++){
        if(!head[x][i].vis){
            //cout<<x<<" "<<head[x][i].to<<endl;
            head[x][i].vis=1;
            dfs(head[x][i].to);
            q.push(str[head[x][i].val]);
        }
    }
}
void output()
{
    string a= q.top(); q.pop();
    cout<<a;
    while(!q.empty()){
        cout<<"."<<q.top();
        q.pop();
    }
}
int in[100];
int out[100];
int main()
{
    int Icase;
    cin>>Icase;
    int n;
    while(Icase--){
        memset(vis,0,sizeof(vis));
        for(int i=0;i<26;i++)
            father[i]=i;
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=0;i<=maxn;i++)
            head[i].clear();
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>str[i];
        sort(str,str+n,cmp);
        for(int i=0;i<n;i++){
            int a=str[i][0]-a; int len=str[i].size();int b=str[i][len-1]-a;
            add(a,b,i,0); vis[a]=1;vis[b]=1; in[b]++;out[a]++; link(a,b);
        }
        int ans=0;
        for(int i=0;i<26;i++)
            if(vis[i]) if(i==father[i]) ans++;
        int flag=0;int in1=0;int out1=0;int sign;int sign1;
        for(int i=0;i<26;i++)
        if(vis[i]) {
            sign1=i;break;
        }
        for(int i=0;i<26;i++)
        if(vis[i]){
            if(in[i]==out[i]) continue;
            if(in[i]-out[i]==1){
                in1++;
            }
            if(out[i]-in[i]==1){
                out1++; sign=i;
            }
            if(out[i]-in[i]>1||out[i]-in[i]>1){
                flag=1;break;
            }
        }
        //cout<<sign<<endl;system("pause");
        if(!flag) if(in1>1||out1>1) flag=1;
        if(ans!=1||flag) cout<<"***"<<endl;
        else{
            if(in1!=0) dfs(sign);
            else dfs(sign1);
            output();
            cout<<endl;
        }
    }
    return 0;
}

poj2337欧拉回路,布布扣,bubuko.com

poj2337欧拉回路

标签:style   blog   color   os   io   for   re   c   

原文地址:http://www.cnblogs.com/yigexigua/p/3865983.html

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