10054 - The Necklace ( 欧拉回路 ~~ )

来源:互联网 发布:淘宝上设计衣服来卖 编辑:程序博客网 时间:2024/05/15 04:24

满足欧拉回路的条件有:

1. 连通;

2.没有奇点;


所以要先判连通,再判所给的点是否全是偶点,若是都符合,则可以打印欧拉回路。


操作步骤详见代码:


#include <stdio.h>#include <string.h>#include <stdlib.h>int n;int G[60][60];int V[60];int vis[60][60];int count[60];void init(){    memset(V,0,sizeof(V));    memset(G,0,sizeof(G));    memset(vis,0,sizeof(vis));    memset(count,0,sizeof(count));}void dfs(int u)//用于判断是否连通;{    for(int v=1;v<=50;v++)    if(G[u][v]&&!vis[u][v])    {        vis[u][v]=1;        V[v]=1;        dfs(v);    }}void euler(int u)//当满足欧拉回路的条件时,用此函数打印欧拉回路;{    for(int v=1;v<=50;v++)    {        if(G[u][v])        {            G[u][v]--;            G[v][u]--;            euler(v);            printf("%d %d\n",v,u);        }    }}int main(){    int T;    scanf("%d",&T);    for(int i=0;i<T;i++)    {        if(i)        printf("\n");        printf("Case #%d\n",i+1);        init();        scanf("%d",&n);        int a,b;        for(int j=0;j<n;j++)        {            scanf("%d%d",&a,&b);            G[a][b]++;            G[b][a]++;            count[a]++;            count[b]++;        }        int ok=0, cnt=0;        /*判断图是否连通*/        V[a]=1;        dfs(a);        for(int j=1;j<=50;j++)        {            if(count[j])            {                if(!V[j])                    cnt++;            }        }        if(cnt) ok=1;        /*接下来是判断有没有奇点,欧拉回路是不应该有奇点的 */        for(int j=1;j<=50;j++)        {            if(count[j]%2==1)            {                ok=1;                break;            }        }                //满足欧拉回路的条件时,打印欧拉回路;        if(ok)        printf("some beads may be lost\n");        else        {            euler(a);        }    }    return 0;}

也许不是最好的解法,不是最快的解法,不过个人感觉比较稳妥。

0 0
原创粉丝点击