POJ - 1438 One-way Traffic(混合图改有向图)

题目大意:给出一张混合图,要求你改变尽量多的双向边,使得改变后的图还是强连通的

解题思路:这题和poj-1515类似,只不过这题是混合题,大体思路还是差不多的,在dfs的时候记录一下桥和使用的是哪些边即可

#include <cstdio>
#include <cstring>

#define min(a,b)((a) < (b) ? (a) : (b))
#define N 2010
#define M 4000010

struct Edge{
    int from, to, dir, next, flag;
}E[M];

int head[N], pre[N], lowlink[N];
int tot, dfs_clock, n, m;

void dfs(int u, int fa) {
    pre[u] = lowlink[u] = ++dfs_clock;

    for (int i = head[u]; i != -1; i = E[i].next) {
        int v = E[i].to;
        if (E[i].flag != -1) continue;
        if (E[i].dir == 0) continue;
        E[i].flag = 1;
        E[i^1].flag = 0;

        if (!pre[v]) {
            dfs(v, u);
            lowlink[u] = min(lowlink[u], lowlink[v]);
            if (lowlink[v] > pre[u]) {
                E[i ^ 1].flag = 1;
            }
        }
        else if (v != fa) {
            lowlink[u] = min(lowlink[u], pre[v]);
        }
    }

}

void solve() {
    memset(pre, 0, sizeof(pre));
    dfs_clock = 0;
    for (int i = 1; i <= n; i++)
        if (!pre[i])
            dfs(i, -1);
    for (int i = 0; i < tot; i += 2) {
        if (E[i].dir == 2 && E[i].flag == 1 && E[i^1].flag == 1) {
            printf("%d %d 2\n", E[i].from, E[i].to);
        }
        else if (E[i].dir == 2 && E[i].flag == 1 && E[i^1].flag == 0) {
            printf("%d %d 1\n", E[i].from, E[i].to);
        }
        else if (E[i].dir == 2 && E[i].flag == 0 && E[i ^ 1].flag == 1) {
            printf("%d %d 1\n", E[i^1].from, E[i^1].to);
        }
    }
}

void AddEdge(int u, int v, int dir) {
    E[tot].from = u;
    E[tot].to = v;
    E[tot].dir = dir;
    E[tot].flag = -1;
    E[tot].next = head[u];
    head[u] = tot++;
}

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

    int a, b, c;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &a, &b, &c);
        if (c == 2) {
            AddEdge(a, b, c);
            AddEdge(b, a, c);
        }
        else {
            AddEdge(a, b, c);
            AddEdge(a, b, 0);
        }
    }
}

int main() {
    while (scanf("%d%d", &n, &m) != EOF) {
        init();
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 19:05:16

POJ - 1438 One-way Traffic(混合图改有向图)的相关文章

POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)

http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图的要求是所有顶点的度数为偶数. 但不管是那个,顶点的度数若是奇数,那都是不能构成的. 这道题目是非常典型的混合图欧拉回路问题,对于双向边,我们先随便定个向,然后就这样先记录好每个顶点的入度和出度. 如果有顶点的度数为奇数,可以直接得出结论,是不能构成欧拉回路的. 那么,如果都是偶数呢? 因为还会存在

POJ 1637 Sightseeing tour (混合图欧拉回路)

POJ 1637 Sightseeing tour 链接:http://poj.org/problem?id=1637 题意:给定一个混合图,既有有向边,又有无向边,问是否存在欧拉回路. 思路: 1 定义 欧拉通路 (Euler tour)--通过图中每条边一次且仅一次,并且过每一顶点的通路. 欧拉回路 (Euler circuit)--通过图中每条边一次且仅一次,并且过每一顶点的回路. 欧拉图--存在欧拉回路的图. 2 无向图是否具有欧拉通路或回路的判定 G有欧拉通路的充分必要条件为:G 连通

Sightseeing tour (poj 1637 混合图的欧拉回路)

Language: Default Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7983   Accepted: 3346 Description The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can see every co

POJ 1637 Sightseeing tour (混合图欧拉回路,网络最大流)

http://poj.org/problem?id=1637 Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7498   Accepted: 3123 Description The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can

POJ 1637 混合图的欧拉回路判定

题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点). 其实,难点在于图中的无向边,需要对所有的无向边定向(指定一个方向,使之变为有向边),使整个图变成一个有向欧拉图(或有向半欧拉图).若存在一个定向满足此条件,则原图是欧拉图(或半欧拉图)否则不是.关键就是如何定向? 首先给原图中的每条无向边随便指定一个方

POJ 1637 Sightseeing tour(混合图的欧拉回路)

题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <algorithm> #include <vector> #include <string> #include <queue> using namespace std; #define INF 0x3ffffff str

POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断

没有想到网络流还能解决这一类问题,完全想不到@[email protected] 一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度.以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起点,现在在一些边可以调换方向的情况下,所有定点的入度和出度之差必定为偶数,因为调换任意一条边的方向都会使两个定点的入度和出度变化2,所以要构成一个欧拉回路所有点的入度和出度之差都为偶数,并设差为deg. 现在问题转化成了能否通过改变一些边的方向来是的所有点的入度出度都为

POJ 1438 One-way Traffic

题意: 与 http://blog.csdn.net/houserabbit/article/details/38958891 类似  只不是将原本的无向图变为混合图 思路: 在上一篇我也写过了 http://blog.csdn.net/houserabbit/article/details/38958891  首先是找桥  那么就需要先把混合图变成无向图  因为题目说答案存在  因此桥必然是混合图里的无向边 然后就是块内的工作了  也是分两种边讨论  只不过判定边是否留下的时候要看一下它是不是

POJ 1637 混合图欧拉回路

先来复习一下混合图欧拉回路:给定一张含有单向边和双向边的图,使得每一点的入度出度相同. 首先对于有向边来说,它能贡献的入度出度是确定的,我们不予考虑.对于无向图,它可以通过改变方向来改变两端点的出入度.好的,我们不妨先将这些无向边随意定向,因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路,所以我们先扫一遍总度数看看是否为偶数,如果是奇数我们弃疗就好. 接下来我们要尝试着修复这些无向边的方向使得度数平衡.首先细化问题到每一个点:对于点u,如果它的入度大于出度,那