標籤:problem 要求 har show img == tin put 輸出
luogu1341思路歐拉迴路和歐拉路的裸題,首先判斷是否存在歐拉路或者歐拉迴路。若且唯若途中每個點的度數都為偶數時,存在歐拉迴路。若且唯若圖中度數為奇數的點的個數為2時,存在歐拉路。如果存在歐拉迴路,就可以找一個最小的點開始dfs。如果存在歐拉路,那就只能從度數為奇數的兩個點中更小的那個開始dfs。歐拉迴路的dfs過程大概就是一邊刪邊,一邊dfs。
,dfs的過程大概就是1-22-33-66-55-44-11入隊,返回4入隊,返回5入隊,返回6-77-98-1010-1111-99-66入隊,返回9入隊,返回11入隊,返回10入隊,返回8入隊,返回7入隊,返回6入隊,返回3入隊,返回2入隊,返回1入隊,結束此時隊列中剛是(1-4-5-6-9-11-10-8-7-6-3-2-1),就是一個合法的歐拉迴路了。因為題目中要求按照字典序最小輸出序列,所以每次搜尋的時候先搜尋字典序小的。然後將隊列倒序輸出才可以。因為要按字典序從小到大搜尋,所以鄰接表似乎就有點麻煩了。所以直接用鄰接矩陣。代碼
#include<cstdio>#include<iostream>using namespace std;const int N = 1000;int du[N],e[N][N],ji[N],ans[N*10],ansjs;char c[5];void dfs(int u) { for(int i = 'A';i <= 'z';++i) { if(!e[u][i]) continue; e[u][i]--; e[i][u]--; dfs(i); } ans[++ansjs]=u;}int main() { int n; scanf("%d",&n); for(int i = 1;i <= n;++i) { scanf("%s",c+1); e[int(c[1])][int(c[2])]++; e[int(c[2])][int(c[1])]++; du[int(c[1])]++; du[int(c[2])]++; } int js=0; for(int i = 'A';i <= 'z';++i) if(du[i]&1) ji[++js]=i; if(js != 0 && js != 2) { puts("No Solution"); return 0; } int s=1000; for(int i = 'A';i <= 'z';++i) { if(!du[i]) continue; if(js == 0) s=min(s,i); else if(du[i]&1) s=min(s,i); } dfs(s); for(int i = ansjs;i >= 1;--i) printf("%c",ans[i]); return 0;}
[luogu1341][無序字母對]