算法图论学习-欧拉路判断(无向图)

261 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

无向图欧拉路的判断

和有向图同理只不过我们现在有有向图的出度和入度并成了度数如果不是欧拉回路的话出度是等于度数的所有这时点的度数应该为偶数如果只是简单的欧拉路那么应该只有起点和终点的度数为奇数点,这就是我们无向图欧拉路的判断条件。如一下代码

int x = 0, y = 0; // x 表示起点 y表示度数为奇数的点的个数有多少个
    for(int i = 1; i <= n; i++)
       if(d[i] & 1) x = i, y ++;
    if(y && y != 2) {
        cout << "No" << endl;
        return;
    }

无向图欧拉路径的输出

我们存边的时候将u->v, v->u都存进去表示这个是个无向边但是注意我们要去存这个边的编号,但是我们的标号最好从2开始因为从2开始的话每一条无向边的编号就是(2,3),(4,5)····并且2 ^ 1 = 3 ^ 1, 4 ^ 1 = 5 ^ 1这样如果我们走了一条边也可以获取他的另一条边

for(int i = 1; i <= m; i++) {
      int u, v; cin >> u >> v;
      e[u].pb({v, ++cnt});
      e[v].pb({u, ++cnt});
      d[u] ++, d[v] ++;
   }

获取路径的话还是需要我们用到dfs写法和之前的有向图欧拉路没什么多大的区别就是多了一个路径的标记

//深搜路径
void dfs(int x) {
    while(f[x] < e[x].size()) {
        int u = e[x][f[x]].fi, idx = e[x][f[x]].se;
        if(!st[idx]) {
            f[x] ++;
            st[idx] = st[idx ^ 1] = true;
            dfs(u);
            que[++tot] = u;
        }else {
            f[x] ++;
        }
    }
}

[例题](欧拉路判断 - 题目 - Daimayuan Online Judge)

这题就是让我们去判断这个无向图是不是一个欧拉路,我们按照上面的代码写一下即可。