題目描述 給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字元串使得每個字母對都在這個字元串中出現。 輸入輸出格式 輸入格式: 第一行輸入一個正整數n。 以下n行每行兩個字母,表示這兩個字母需要相鄰。 輸出格式: 輸出滿足要求的字元串。 如 ...
題目描述
給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字元串使得每個字母對都在這個字元串中出現。
輸入輸出格式
輸入格式:第一行輸入一個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
輸出格式:輸出滿足要求的字元串。
如果沒有滿足要求的字元串,請輸出“No Solution”。
如果有多種方案,請輸出前面的字母的ASCII編碼儘可能小的(字典序最小)的方案
輸入輸出樣例
輸入樣例#1:4 aZ tZ Xt aX輸出樣例#1:
XaZtX
說明
【數據規模與約定】
不同的無序字母對個數有限,n的規模可以通過計算得到。
這題是歐拉迴路的裸題
但是有兩個地方需要註意
1.在函數中輸出不能使用傳值變數為迴圈變數
2.ios::sync容易引起RE!、
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdlib> 6 using namespace std; 7 const int MAXN=4001; 8 void read(int & n) 9 { 10 char c='+';int x=0;int flag=0; 11 while(c<'0'||c>'9') 12 { c=getchar(); if(c=='-') flag=1; } 13 while(c>='0'&&c<='9') 14 {x=x*10+(c-48);c=getchar();} 15 flag==1?n=-x:n=x; 16 } 17 int n; 18 int map[MAXN][MAXN]; 19 int indegree[MAXN]; 20 int ans[MAXN]; 21 int flag=0; 22 void dfs(int num,int now) 23 { 24 ans[now]=num; 25 if(now==n+1) 26 { 27 for(int i=1;i<=n+1;i++) 28 printf("%c",(char)ans[i]); 29 exit(0); 30 } 31 for(int i=65;i<=127;i++) 32 { 33 if(map[num][i]) 34 { 35 map[num][i]=0; 36 map[i][num]=0; 37 dfs(i,now+1); 38 map[num][i]=1; 39 map[i][num]=1; 40 } 41 } 42 ans[now]=0; 43 } 44 int main() 45 { 46 cin>>n; 47 ios::sync_with_stdio(false); 48 for(int i=1;i<=n;i++) 49 { 50 char a,b; 51 cin>>a>>b; 52 if(!map[a][b]) 53 { 54 map[a][b]=1; 55 map[b][a]=1; 56 indegree[a]++; 57 indegree[b]++; 58 } 59 } 60 int tot=0; 61 int bgji=0x7fff,bgou=0x7ffff; 62 for(int i=65;i<=127;i++) 63 { 64 if(indegree[i]%2==1) 65 { 66 tot++; 67 bgji=min(bgji,i); 68 } 69 else if(indegree[i]) 70 bgou=min(i,bgou); 71 } 72 if(tot!=0&&tot!=2) 73 { 74 printf("No Solution"); 75 exit(0); 76 } 77 tot==0? 78 dfs(bgou,1): 79 dfs(bgji,1); 80 return 0; 81 }