POJ 2337 Catenyms (歐拉迴路)

來源:互聯網
上載者:User

題意:給你n個單詞,讓每個單詞的最後一個字母恰好等於下一個單詞的第一個字母。構造這樣一個串,使每個單詞恰好被用到一次。取字典序最小的。

例如,把 aloha     arachnid    dog   gopher    rat    tiger  串成 aloha.arachnid.dog.gopher.rat.tiger。 若所個的單詞不能構成這樣一個串,那麼輸出“***”。

題解:乍一看像哈密頓圖,但其實只要把每個單詞當做一條邊,就可以用歐拉圖來做。首先對所有的單詞按字典序排一下,其實也就是將所有的邊排下序,以保證字典序最小。當然,如果採用頭插法構圖,只需要每次插入邊的時候冒泡一下也可以保證字典序。還有兩點需要注意:1.驗證圖的連通性;2.如果是歐拉圖,則從字典序最小的邊的起點開始搜尋,如果是半歐拉圖,一定要從出度大於入度的那條邊開始搜尋。

#include <cstring>#include <algorithm>#include <iostream>using namespace std;struct Word { int l; char s[21]; };struct Edge { int st, ed; bool del; };Word word[1002];Edge edge[1002];int in[30], out[30];int stk[1002], father[30];bool mark[30];int E, top;int cmp ( const void* a, const void* b ){return strcmp( ((Word*)a)->s, ((Word*)b)->s );}int find_set ( int x ){if ( father[x] != x )father[x] = find_set ( father[x] );return father[x];}bool judge (){int t = 0;for ( int i = 0; i < 26; i++ )if ( mark[i] && father[i] == i ) t++;return t == 1;}void find_path ( int u ){for ( int i = 0; i < E; i++ ){if ( ! edge[i].del && edge[i].st == u ){edge[i].del = true;find_path ( edge[i].ed );stk[top++] = i;}}}int main(){int cs;scanf("%d",&cs);while ( cs-- ){scanf("%d",&E);int u, v, c1, c2, start, i;for ( i = 0; i < 26; i++ ){in[i] = out[i] = 0;father[i] = i;mark[i] = false;}for ( i = 0; i < E; i++ ){scanf("%s",word[i].s);word[i].l = strlen(word[i].s);}qsort(word, E, sizeof(word[0]), cmp);for ( i = 0; i < E; i++ ){u = word[i].s[0] - 'a';v = word[i].s[word[i].l-1] - 'a';edge[i].st = u;edge[i].ed = v;edge[i].del = false;mark[u] = mark[v] = true;out[u]++; in[v]++;u = find_set ( u );v = find_set ( v );if ( u != v ) father[v] = u;}c1 = c2 = 0;start = edge[0].st;for ( i = 0; i < 26; i++ ){if ( in[i] == out[i] ) continue;else if ( in[i] - 1 == out[i] ) c1++;else if ( out[i] - 1 == in[i] ) { c2++; start = i; }else break;}if ( i == 26 && ((c1 == c2 && c1 == 1) || (c1 == c2 && c1 == 0)) && judge() ){top = 0;find_path ( start );for ( i = top - 1; i > 0; i-- )printf("%s.",word[stk[i]].s);printf("%s\n",word[stk[0]].s);}else printf("***\n");}//system("pause");return 0;}

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.