poj 2337

欧拉路径。

代码:

#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

int n;

char x[1001][22];

struct e{
	int data;
	int num;
	int vis;
};

int in[30],out[30],v[30];

vector<e> edge[30],edge1[30];


int cmp1(const void *a,const void*b){
	char *s1=(char *)a;
	char *s2=(char *)b;
	return strcmp(s1,s2);
}

void dfs(int s){
	int i,j,k;
	v[s]=1;
	for(i=0;i<edge1[s].size();i++)
		if(v[edge1[s][i].data]==0)
			dfs(edge1[s][i].data);
}

int judge(){
	int i,j,f=0;
	memset(v,0,sizeof(v));
	dfs(x[0][0]-'a');
	for(i=0;i<26;i++)
		if(v[i]==0&&in[i]!=0)
			return -1;
	j=-1;
	for(i=0;i<26;i++)
		if(in[i]!=out[i])
		{
			if(in[i]<out[i])
			{
				if(in[i]-out[i]==-1&&f==0)
				{
					f=1;j=i;
				}
				else
					break;
			}
		}
	if(i<26) return -1;
	if(j!=-1) return j;
	else
		for(i=0;i<26;i++)
			if(out[i]!=0)
				return i;
}

int ans[1001],top;

void solve(int s){
	int i;
	for(i=0;i<edge[s].size();i++)
	{
		if(edge[s][i].vis==0)
		{
			edge[s][i].vis=1;
			solve(edge[s][i].data);
			ans[top++]=edge[s][i].num;
		}
	}
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t;
	cin>>k;
	while(k--)
	{
		cin>>n;
		memset(in,0,sizeof(in));
		memset(out,0,sizeof(out));
		for(i=0;i<26;i++)
		{
			edge[i].clear();
			edge1[i].clear();
		}

		for(i=0;i<n;i++)
			cin>>x[i];
		qsort(x,n,sizeof(char)*22,cmp1);

		for(i=0;i<n;i++)
		{
			s=x[i][0]-'a';
			t=x[i][strlen(x[i])-1]-'a';
			out[s]++;
			in[t]++;
			e b;
			b.num=i;
			b.data=t;
			b.vis=0;
			edge[s].push_back(b);
			edge1[s].push_back(b);
			b.data=s;
			edge1[t].push_back(b);
		}
		s=judge();

		if(s==-1)
		{
			cout<<"***"<<endl;
			continue;
		}

		top=1;
		solve(s);
		for(i=n;i>=2;i--)
			cout<<x[ans[i]]<<'.';
		cout<<x[ans[1]]<<endl;
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-04-19 11:14  宇宙吾心  阅读(497)  评论(0)    收藏  举报

导航