欧拉图

以前一直认为自己懂了,,,,然而。。。。

先来书上的定义

图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉回路。具有欧拉回路的图成为欧拉图。

就是从图上的一点出发,经过所有的边必须且只能一次,最终回到起点的路径


基本算法:深度优先搜索

应用:使用深度优先搜索,如果某条边被搜索到,则标记这条边已为选择,并且即使回溯也不能将当前

边的状态改回未选择,每次回溯时,记录回溯路径。搜索结束后,记录的回溯路径就是欧拉回路。


欧拉图详解看这里

http://blog.csdn.net/u013480600/article/details/44805491

例题链接:

http://poj.org/problem?id=2230

分析:每条边要求正向反向各走一次,所以一定存在欧拉回路。

本题的要求不是输出边的序列,而是点的序列,其实是一样的,根据边的序列很容易确定点的序列

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 100005
int cnt;
struct node
{
    int to;
    int nxt;
};
int head[maxn];
node data[maxn];
int N,M;
int vis[maxn];

void add(int from ,int to)
{
    data[cnt].to = to;
    data[cnt].nxt = head[from];
    head[from] = cnt++;
}

void DFS(int u)
{
    for(int i = head[u] ; i != -1 ; i = data[i].nxt)
    {
        int v = data[i].to;
        if( !vis[i] )
        {
            vis[i] = 1;
            DFS(v);
        }
    }
    cout << u << endl;
}

int main()
{
    memset(head,-1,sizeof(head));

    cin >> N >> M;
    for(int i = 1 ; i <= M ; ++i)
    {
        int a, b;
        scanf("%d %d",&a,&b);
        add(a,b);
        add(b,a);
    }
    DFS(1);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值