給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造乙個有n+1個字母的字串使得每個字母對都在這個字串中出現。
輸入格式:
第一行輸入乙個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
輸出格式:
輸出滿足要求的字串。
如果沒有滿足要求的字串,請輸出「no solution」。
如果有多種方案,請輸出前面的字母的ascii編碼盡可能小的(字典序最小)的方案
輸入樣例#1:
4aztz
xtax
輸出樣例#1:
xaztx
【資料規模與約定】
不同的無序字母對個數有限,n的規模可以通過計算得到。
題解:剛讀完題目沒有什麼思路,想打個爆搜搞一搞。然而回頭一想這是圖論專題於是畫了個圖,將每對字母連起來,每個字母都要出現而且要n+1個字母,就是要把所有邊不重複走的情況下遍歷一邊。好像叫什麼...尤拉路!對沒錯尤拉路。水題啊開心。然而實現的時候有些蜜汁錯誤搞不懂
const
maxn=100000;
var a:array['a'..'z','a'..'z']of longint;
kk:array['a'..'z','a'..'z']of boolean;
du,v:array['a'..'z']of longint;
ans:array[0..maxn]of char;
n,sum,i,tot:longint;
fi,ch:char;
procedure init;
var i:longint;
ch1,ch2,p1,p2:char;
begin
readln(n);p1:='0';p2:='0';fi:='0';
for i:=1 to n do
begin
readln(ch1,ch2);
inc(a[ch1,ch2]);
inc(a[ch2,ch1]);
inc(du[ch1]);inc(du[ch2]);
// kk[ch1,ch2]:=true;kk[ch2,ch1]:=true;
end;
tot:=0;
for ch1:='a' to 'z' do
begin
if (du[ch1]>0)and(p2='0') then p2:=ch1;
if odd(du[ch1]) then
begin
inc(tot);
if p1='0' then p1:=ch1;
end;
end;
if tot=2 then fi:=p1;
if tot=0 then fi:=p2;
end;
procedure dfs(dep:longint;x:char);
var ch:char;
begin
ans[dep]:=x;
if dep=n+1 then
begin
for i:=1 to n+1 do
write(ans[i]);
halt;
end;
for ch:='a' to 'z' do
if (a[x,ch]>0) then
begin
dec(a[ch,x]);dec(a[x,ch]);
dfs(dep+1,ch);
inc(a[ch,x]);inc(a[x,ch]);
end;
end;
begin
init;
if (tot<>0)and(tot<>2) then
begin
writeln('no solution');
halt;
end;
dfs(1,fi);
for i:=1 to sum do
write(ans[i]);
end.
洛谷1341 無序字母對 尤拉路
問題描述 給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no...
無序字母對 洛谷1341 尤拉迴路
給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no solution 如果有多種...
洛谷1341 無序字母對(尤拉迴路)
點此看題面 大致題意 給你 n 個各不相同的無序字母對 注意 兩個字母可能相同,被這個坑了好幾次 請構造乙個長度為 n 1 的字串包含每個字母對。這是一道裸的尤拉迴路,只不過是字串版的,步驟較經典版略顯麻煩。依照尤拉迴路的思路,我們先統計出每個字母出現的次數。然後對其中奇點的個數分類討論 若沒有奇點...