[luogu1341][無序字母對]

來源:互聯網
上載者:User

標籤: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][無序字母對]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.