uva10054 The Necklace

本文介绍了一种求解欧拉回路问题的算法实现,包括判断图是否为欧拉图的方法及输出欧拉回路的具体步骤。通过对比错误代码与修正后的代码,展示了如何避免陷入局部最优解。

本题先要判断是否是欧拉回路(判断是否连通,是否相关点都是偶数),然后把路输出就行了。

 

错误代码

#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std ;
struct node
{
    int x,y;
};
node a[2000],cun[2000];
int flag,cen,n,wei;
int vis[2000];
void judge(int lian)
{   cout<<cen<<endl;
    cen++;
    if(cen==n)
    {
        flag=1;
        return;
    }
    int i;
    for(i=0; i<n; ++i)
    {
        if(lian==a[i].x&&vis[i]==0 )
        {
            cun[cen].x=a[i].x;
            cun[cen].y=a[i].y;
            vis[i]=1;
            wei=a[i].y;
            cout<<cun[cen].x<<" "<<cun[cen].y<<endl;
            judge(a[i].y);
            return;
        }
        else if(lian==a[i].y&&vis[i]==0)
        {
            cun[cen].x=a[i].y;
            cun[cen].y=a[i].x;
            vis[i]=1;
            wei=a[i].x;
             cout<<cun[cen].x<<" "<<cun[cen].y<<endl;
            judge(a[i].x);
            return;
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    int casei=1;
    scanf("%d",&t);
    while(t--)
    {
        if(casei!=1)printf("\n");
        memset(vis,0,sizeof(vis));
        flag=0;
        int i;
        scanf("%d",&n);
        for(i=0; i<n; ++i)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        cen=0;
        int dian=a[0].y;
        vis[0]=1;
        cun[0]=a[0];
        //cun[0].x=a[0].x;
        //cun[0].y=a[0].y;
        judge(dian);
        printf("Case #%d\n",casei++);
        if(flag&&wei==a[0].x)
        {
            for(i=0; i<n; ++i)
            {
                printf("%d %d\n",cun[i].x,cun[i].y);
            }
        }
        else
        {
            printf("some beads may be lost\n");
        }
    }
    return 0 ;
}
/*过不去的数据  我的judge()函数有个致命缺点,下面数据运行后,第一个50 49,第二个49 50,三50 49,四49 50,剩个49 49插不进去了
5
50 49 
49 50
50 49
49 50 
49 49
*/
//改正后的正确代码
 
#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std ;
struct node
{
    int x,y;
};
node a[2000],cun[2000];
int flag,cen,n,wei,pi;
int vis[2000];
void judge(int lian)
{ //  cout<<cen<<endl;
    cen++;
    if(cen==n)
    {
        flag=1;
        return;
    }
    int i;
    for(i=0; i<n; ++i)
    {
        if(lian==a[i].x&&vis[i]==0 )
        {
            vis[i]=1;
            //wei=a[i].y;
            judge(a[i].y);
            cun[pi].x=a[i].x;
            cun[pi].y=a[i].y;
          // cout<<cun[pi].x<<" "<<cun[pi].y<<endl;
           pi++;
           // return;
        }
        else if(lian==a[i].y&&vis[i]==0)
        {
            vis[i]=1;
            wei=a[i].x;

            judge(a[i].x);

            cun[pi].x=a[i].y;
            cun[pi].y=a[i].x;
           // cout<<cun[pi].x<<" "<<cun[pi].y<<endl;
           pi++;
           // return;
        }
    }
}
int f[100];
int find(int x )
{
    return f[x]==x?x:f[x]=find(f[x]);
}
void liantong()
{
    int i;
    for(i=0;i<55;++i)f[i]=i;
    for(i=0;i<n;++i)
    {
        int e=find(a[i].x );int v=find(a[i].y);
        if(e!=v)
        {
            f[e]=v;
        }
    }
    int ans=find(a[0].x);
    for(i=1;i<n;++i)
    {
        if(ans!=find(a[i].x)||ans!=find(a[i].y))
        {
            flag=0;
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    int casei=1;
    scanf("%d",&t);
    while(t--)
    {
        if(casei!=1)printf("\n");
        memset(vis,0,sizeof(vis));
        flag=1;
        int i;
        int shu[100]={0};
        scanf("%d",&n);
        for(i=0; i<n; ++i)
        {
            scanf("%d%d",&a[i].x,&a[i].y);

            ++shu[a[i].x];
            ++shu[a[i].y ];
        }
        for(i=0;i<55;++i)
        {
            if(shu[i]%2==1)flag=0;
        }
        printf("Case #%d\n",casei++);
        if(flag==0)
        {
             printf("some beads may be lost\n");continue;
        }
        liantong();
        if(flag==0)
        {
             printf("some beads may be lost\n");continue;
        }
        cen=0;
        int dian=a[0].y;
        vis[0]=1;
        pi=0;
        //cun[0].x=a[0].x;
        //cun[0].y=a[0].y;
        judge(dian);
        cun[pi]=a[0];
        pi++;

        if(flag)
        {
            for(i=n-1; i>=0; --i)
            {
                printf("%d %d\n",cun[i].x,cun[i].y);
            }
        }
        else
        {
            printf("some beads may be lost\n");
        }
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值