题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入输出格式
输入格式:
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式:
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
说明
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
欧拉道路
1联通
2如果奇点为2或者0 可行
wa: 数组开了N 遍历的时候也是N
不能边dfs边打印!!!一定是错的!!!
因为如果有子环可能提前遍历到终点了 打印了终点 然后继续遍历子环 显然不合理 递归保存才行!!!!!!!
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) #define inf 0x3f3f3f3f ////////////////////////////////// const int N=500; int mp[N+5][N+5]; int cnt[N+5]; char ans[N+5]; int f[N+5]; int find1(int x) { return x==f[x]?x:f[x]=find1(f[x]); } void union1(int x,int y) { int a=find1(x); int b=find1(y); f[a]=b; } int n; int cntt; void dfs(int x) { rep(i,1,N) if(mp[x][i]) { mp[x][i]--;mp[i][x]--; //printf("%c",i); // ans[cntt++]=x;//这两种都是必然错的!!!!想一想 dfs(i); } ans[n--]=x; } int main() { RI(n); char s[3]; rep(i,1,N) f[i]=i,cnt[i]=0; rep(i,1,n) { RS(s); int a=s[0],b=s[1]; union1(a,b); cnt[a]++;cnt[b]++; mp[a][b]++; mp[b][a]++; } int num=0; rep(i,1,N) if(f[i]==i&&cnt[i])num++; if(num!=1) printf("No Solution "); else { num=0; int head=-1; rep(i,1,N) if(cnt[i]&1)num++; if(num!=2&&num!=0) { printf("No Solution ");return 0; } rep(i,1,N) if(cnt[i]&1){head=i;break;} if(head==-1)rep(i,1,N)if(cnt[i]){head=i;break;} // printf("%c",head);//这样写是错的!!!! dfs(head); puts(ans); } return 0; }