洛谷1341 無序字母對 尤拉路

2021-07-23 13:25:35 字數 1301 閱讀 6411

【問題描述】

給定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 的字串包含每個字母對。這是一道裸的尤拉迴路,只不過是字串版的,步驟較經典版略顯麻煩。依照尤拉迴路的思路,我們先統計出每個字母出現的次數。然後對其中奇點的個數分類討論 若沒有奇點...