欧拉图

来源:互联网 发布:java ocr文字识别 编辑:程序博客网 时间:2024/05/18 16:15

poj 2230[欧拉图]

欧拉图的求解十分简单,只需要进行一次dfs即可。

void dfs(int v)
{
    for(int i=head[v];i!=-1;i=edge[i].next)
    {
        if(!edge[i].vis)
        {
            edge[i].vis=1;
            dfs(edge[i].to);
        }
    }
    printf("%d\n",v);
}

以上代码按逆序输出欧拉回路中访问的点

void dfs(int v)
{
    for(int i=head[v];i!=-1;i=edge[i].next)
    {
        if(!edge[i].vis)
        {
            edge[i].vis=1;
            dfs(edge[i].to);
            printf("%d\n",i);
        }
    }
}

逆序输出访问的边


poj2438【哈密顿回路算法】

算法的主要思想就是扩展点,知道找到,其中用到数组的反转

末班题,#include<iostream>
#include<fstream>
#include<set>
#include<stack>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;


typedef long long LL;
const int mx=200;
bool map[mx*3][mx*3];
int ans[mx*3];
bool visit[mx*3];
int n,m;
void init()
{
    memset(visit,0,sizeof(visit));
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=n*2;i++)
        for(int j=1;j<=n*2;j++)
            if(i==j)  map[i][j]=0;
            else  map[i][j]=1;
}
void reverse(int ans[],int s,int t)
{
    while(s<t)
    {
        int temp=ans[s];ans[s]=ans[t];ans[t]=temp;
        s++;
        t--;
    }
}
void Hamilton()
{
    int s=1,t;
    int i,j;
    int w;
    for(i=1;i<=n*2;i++)
        if(map[s][i])  break;
    t=i;
    visit[s]=visit[t]=1;
    ans[0]=s,ans[1]=t;
    int ansi=2;
    while(1)
    {
        while(1)
        {
            for(i=1;i<=n*2;i++)
            {
                if(map[t][i]&&!visit[i])
                {
                    ans[ansi++]=i;
                    visit[i]=1;
                    t=i;
                    break;
                }
            }
            if(i>n*2)  break;
        }
        w=ansi-1,i=0; reverse(ans,i,w);
        int temp=s;s=t;t=temp;
        while(1)
        {
            for(i=1;i<=n*2;i++)
            {
                if(map[t][i]&&!visit[i])
                {
                    ans[ansi++]=i;
                    visit[i]=1;
                    t=i;
                    break;
                }
            }
            if(i>n*2) break;
        }
        if(!map[s][t])
        {
            for(i=1;i<ansi-2;i++)
                if(map[ans[i]][t]&&map[s][ans[i+1]])
                    break;
            w=ansi-1;
            i++;
            t=ans[i];
            reverse(ans,i,w);
        }
        if(ansi==n*2)  return ;
        for(j=1;j<=n*2;j++)
        {
            if(visit[j])  continue;
            for(i=1;i<ansi-2;i++)
                if(map[ans[i]][j])
                    break;
            if(map[ans[i]][j])
                    break;
        }
        s=ans[i-1];
        t=j;
        reverse(ans,0,i-1);
        reverse(ans,i,ansi-1);
        ans[ansi++]=j;
        visit[j]=1;
    }
}
int main( )
{
    //freopen("in.txt","r",stdin);


    while(scanf("%d %d",&n,&m),m||n)
    {
        init();
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            map[a][b]=map[b][a]=0;
        }
        Hamilton();
        printf("%d",ans[0]);
        for(int i=1;i<n*2;i++)
            printf(" %d",ans[i]);
        printf("\n");
    }
    return 0;
}


0 0
原创粉丝点击