【問題描述】
給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造乙個有n+1個字母的字串使得每個字母對都在這個字串中出現。
【輸入格式】
第一行輸入乙個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
【輸出格式】
輸出滿足要求的字串。
如果沒有滿足要求的字串,請輸出「no solution」。
如果有多種方案,請輸出前面的字母的ascii編碼盡可能小的(字典序最小)的方案
【輸入樣例】
4 az
tz xt
ax【輸出樣例】
xaztx
【資料範圍】
不同的無序字母對個數有限,n的規模可以通過計算得到
這道題實質上是無向尤拉路徑問題,需判斷連個條件,乙個是圖要基連通,乙個是除兩個點以外其餘點的度要為偶數。這道題我用的是鄰接表,不如用鄰接矩陣寫起來方便。所以在尤拉路問題時可以優先考慮鄰接矩陣。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1000;
vector
e;int n,d[150],s=maxn,vis[maxn];
char ch[maxn][5];
struct data
;vector
g[150];
bool cmp(data a,data b)
e.push_back(i);
}bool check()
}if(cnt!=0&&cnt!=2) return
0; memset(vis,0,sizeof(vis));
dfs(s);
if(e.size()!=n+1) return
0; return1;}
int main()
); g[ch[i][1]].push_back((data));
d[ch[i][1]]++,d[ch[i][0]]++;
s=min(s,(int)ch[i][0]),s=min(s,(int)ch[i][1]);
}for(int i='a';i<='z';i++)
if(check())
else
printf("no solution\n");
return
0;}
洛谷1341 無序字母對 尤拉路
給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no solu...
無序字母對 洛谷1341 尤拉迴路
給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no solution 如果有多種...
洛谷1341 無序字母對(尤拉迴路)
點此看題面 大致題意 給你 n 個各不相同的無序字母對 注意 兩個字母可能相同,被這個坑了好幾次 請構造乙個長度為 n 1 的字串包含每個字母對。這是一道裸的尤拉迴路,只不過是字串版的,步驟較經典版略顯麻煩。依照尤拉迴路的思路,我們先統計出每個字母出現的次數。然後對其中奇點的個數分類討論 若沒有奇點...