hihoCoder#1181(歐拉路徑)

來源:互聯網
上載者:User

標籤:

時間限制:10000ms單點時限:1000ms記憶體限制:256MB描述

在上一回中小Hi和小Ho控制著主角收集了分散在各個木橋上的道具,這些道具其實是一塊一塊骨牌。

主角繼續往前走,面前出現了一座石橋,石橋的盡頭有一道火焰牆,似乎無法通過。

小Hi注意到在橋頭有一張小紙片,於是控制主角撿起了這張紙片,只見上面寫著:

將M塊骨牌首尾相連放置於石橋的凹糟中,即可關閉火焰牆。切記骨牌需要數字相同才能串連。——By 無名的冒險者

小Hi和小Ho開啟了主角的道具欄,發現主角恰好擁有M快骨牌。

小Ho:也就是說要把所有骨牌都放在凹槽中才能關閉火焰牆,數字相同是什麼意思?

小Hi:你看,每一塊骨牌兩端各有一個數字,大概是只有當數字相同時才可以相連放置,比如:

小Ho:原來如此,那麼我們先看看能不能把所有的骨牌串連起來吧。

 

提示:Fleury演算法求歐拉路徑

 輸入

第1行:2個正整數,N,M。分別表示骨牌上出現的最大數字和骨牌數量。1≤N≤1,000,1≤M≤5,000

第2..M+1行:每行2個整數,u,v。第i+1行表示第i塊骨牌兩端的數字(u,v),1≤u,v≤N

輸出

第1行:m+1個數字,表示骨牌首尾相連後的數字

比如骨牌串連的狀態為(1,5)(5,3)(3,2)(2,4)(4,3),則輸出"1 5 3 2 4 3"

你可以輸出任意一組合法的解。

範例輸入
5 53 53 24 23 45 1
範例輸出
1 5 3 4 2 3
注意:此題目必須從1號結點開始遍曆才能AC.無向圖刪邊的時候要將與u,v相關聯的有向邊同時刪除。
無向圖求歐拉路徑用代碼1方便,有向圖求歐拉路徑利用前向星方便。
#include <cstdio>#include <cstring>#include <vector>using namespace std;const int MAXN=1005;struct Edge{    int u,v;    int getTo(int u)    {        if(u==this->u)    return v;        else return this->u;    }}es[5005];int n,m;int deg[MAXN],vis[5005];int path[5005],top;vector<int> arc[MAXN];void dfs(int u){    for(int i=0,size=arc[u].size();i<size;i++)    {        int id=arc[u][i];        if(!vis[id])        {            vis[id]=1;            int v=es[id].getTo(u);            dfs(v);        }    }    path[top++]=u;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(deg,0,sizeof(deg));        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)        {            arc[i].clear();        }        for(int i=1;i<=m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            es[i].u=u;            es[i].v=v;            arc[u].push_back(i);            arc[v].push_back(i);            deg[u]++;            deg[v]++;        }        /* WA??        for(int i=1;i<=n;i++)        {            if(deg[i]%2==1)            {                dfs(i);                break;            }        }        */        dfs(1);        for(int i=0;i<top-1;i++)        {            printf("%d ",path[i]);        }        printf("%d\n",path[top-1]);    }    return 0;}

 前向星實現.

#include <cstdio>#include <cstring>using namespace std;const int MAXN=1005;struct Edge{    int to,net;    bool tag;}es[MAXN*10];int n,m;int head[MAXN],tot;int path[5005],top;int deg[MAXN];void addedge(int u,int v){    es[tot].to=v;    es[tot].tag=false;    es[tot].net=head[u];    head[u]=tot++;}void dfs(int u){    for(int i=head[u];i!=-1;i=es[i].net)    {        if(!es[i].tag)        {            int v=es[i].to;            for(int j=head[v];j!=-1;j=es[j].net)            {                if(es[j].to==u&&!es[j].tag)                {                    es[j].tag=true;                    break;                }            }            es[i].tag=true;            dfs(v);        }    }    path[top++]=u;}int main(){    memset(head,-1,sizeof(head));    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++)    {        int u,v;        scanf("%d%d",&u,&v);        addedge(u,v);        addedge(v,u);        deg[u]++;        deg[v]++;    }    /* Wrong     for(int i=1;i<=n;i++)    {        if(deg[i]%2==1)        {            dfs(i);            break;        }    }    */    dfs(1);//Accepted    for(int i=0;i<top-1;i++)    {        printf("%d ",path[i]);    }    printf("%d\n",path[top-1]);    return 0;}

 

 

hihoCoder#1181(歐拉路徑)

聯繫我們

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