洛谷P1341 無序字母對

2022-05-20 23:38:09 字數 2362 閱讀 6389

思路:給2n個點,取出其中n+1個點,判斷能不能組成乙個符合題意的字串。

可以比擬圖,n + 1個點有n條邊,然後他們又是一條路上的點。

可以比擬尤拉圖,如果可以構成環,就是說每個點的度都是偶數,

即從任意點出發都能回到該點,就是尤拉閉跡,即尤拉迴路。

如果不能構成環,有兩個點的度是奇數,其他點的度數都是偶數,說明

可以組成一條尤拉開跡,就是尤拉迴路拆去了某條邊,讓環無法形成。

那題目就簡單了,這裡有乙個注意點,也算乙個坑吧,就是輸出路線時,

如果你是邊輸出邊遍歷點的話會出現一種情況:

ax xy yz za zz

輸出答案: axyzaz

實際答案: axyzza

為什麼呢,第乙個答案很容易想到,第二個呢?

注意:我們在存答案時,我們總是 str[++l] = ic[now](**裡有),那麼什麼時候才會寫下第乙個答案呢?

顯然,當乙個分支到底了,寫下答案並層層回歸。那麼我們就不難想出第二種答案了,

當z因為貪心遍歷到a,而a沒有與其他點相鄰,那麼a就是第乙個寫下的答案了,如果還有與a相鄰的點,

那麼一定會進入另乙個分支。

補:當然需要判是否連通,但這個題不判也可以過,資料有點水。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

using

namespace

std;

1011 typedef long

long

ll;12

#define inf (1ll << 25)

13#define rep(i,j,k) for(int i = (j); i <= (k); i++)

14#define rep__(i,j,k) for(int i = (j); i < (k); i++)

15#define per(i,j,k) for(int i = (j); i >= (k); i--)

16#define per__(i,j,k) for(int i = (j); i > (k); i--)

1718

const

int n = 60;19

inttot[n];

20bool

21int

fa[n];

22 mapic;

23 mapci;

24int

g[n][n];

25char str[10010

];26

intl;

2728

int find_root(int

x)31

32void merge(int x,int

y)37

38void dfs(int

now)

45 str[++l] =ic[now];46}

4748

intmain()

61 rep(i,26,51)65

66//

rep(i,1,52) cout << ic[i] << " ";

67//

cout << endl;

6869

intn;

70 cin >>n;

71char

a,b;

72 rep(i,1

,n)83

84int odd = 0; //

奇數度85

int even = 0; //

偶數度86 rep(i,1,52) if

87if(tot[i] & 1) odd++;

88else even++;89}

9091

//判連通

92int t = 0

;94 t++;

95if(t == 2) break;96

}9798//

不連通99

if(t == 2) cout << "

no solution

"<100else

if(odd == 2)

105106 per(i,l,1) cout <107 cout <108}

109else

if(odd == 0)

114 per(i,l,1) cout <115 cout <116}

117else cout << "

no solution

"<118119

120getchar(); getchar();

121return0;

122 }

洛谷 P1341 無序字母對

這道題第一眼以為是一道字串的題,但細想一下是一道求尤拉路的圖論題。把每一對對應關係看成一條邊,本題即求這張圖上是否存在乙個尤拉迴路或尤拉路,並要求字典序最小的方案,那麼我們在dfs的時候就要從該點所連的最小的點開始便利,並將所得的結果存在乙個陣列中,最後逆序輸出。include include in...

洛谷P1341 無序字母對

給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串 現。不同的無序字母對個數有限,n的規模可以通過計算得到。各不相同的無序字母對總數有限,有52 51 2 1326種,這是n的規模。此題的建模是圖論,給出的無序字母...

洛谷P1341 無序字母對

題目鏈結 根據題意,只有在每兩個相鄰的字母都構成乙個要求的無序字母對時,才能滿足要求,我們不妨將每個字母看成乙個節點,每個無序字母對看成乙個無向邊,我們要從乙個點出發,不重複地走完所有的邊,所走的路徑上的點構成的字串即為乙個合法的解 這就轉化成了求一條字典序最小的尤拉路徑 字典序就用堆搞一下就行了 ...