hihor 学习日记:hiho一下 第五十周(欧拉路, DFS)

http://hihocoder.com/contest/hiho50/problem/1

题意:

一张图,求每条边经过一次走完整个图,

思路:

因为前提已经是图是一个欧拉图,所以先DFS一条路径,然后回溯是对于每个节点进行DFS,这样就可以了

AC代码:

#include <bits/stdc++.h>

using namespace std;
#define LL long long
const int Mod = 1e9 + 7;
const int maxn = 1e5 + 5;
const double eps = 0.00000001;
const int INF = 0x3f3f3f3f;

struct Edge{
    int v, nxt;
}edge[maxn << 1];

int tot, head[maxn];
int N, M;

int path[maxn];
int path_size = 0;
int vis[maxn];

void init() {
    tot = 0;
    memset(head, -1, sizeof(head));
    memset(vis, 0, sizeof(vis));
}

void addEdge(int u, int v) {
    edge[tot].v = v;
    edge[tot].nxt = head[u];
    head[u] = tot ++;

    edge[tot].v = u;
    edge[tot].nxt = head[v];
    head[v] = tot ++;
}

void DFS(int u) {
    //cout << u << endl;
    for (int i = head[u]; i + 1; i = edge[i].nxt) {
        int v = edge[i].v;
        if(!vis[i] && !vis[i ^ 1]) {
            vis[i] = vis[i ^ 1] = 1;
            DFS(v);
        }
    }
    path[path_size ++] = u;
}


int main()
{
    init();
    cin >> N >> M;
    for (int i = 0; i < M; i ++) {
        int l, r;
        cin >> l >> r;
        addEdge(l, r);
    }
    DFS(1);
    for (int i = 0; i < path_size; i ++)
        cout << path[i] << " ";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/85052176
今日推荐