ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

//网络流判定混合图欧拉回路
//通过网络流使得各点的出入度相同则possible,否则impossible
//残留网络的权值为可改变方向的次数,即n个双向边则有n次
//Time:157Ms    Memory:348K
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 205
#define INF 0x3f3f3f3f
int n,m;
int s,t;
int dif[MAXN];
int res[MAXN][MAXN];    //残留网络-代表可变方向数
int pre[MAXN];
bool bfs()
{
    memset(pre,-1,sizeof(pre));
    queue<int> q;
    q.push(s); pre[s] = 0;
    while(!q.empty()){
        int cur = q.front();
        q.pop();
        for(int i = 1; i <= t; i++)
        {
            if(pre[i] == -1 && res[cur][i])
            {
                pre[i] = cur;
                if(i == t) return true;
                q.push(i);
            }
        }
    }
    return false;
}
int EK()
{
    int maxFlow = 0;
    while(bfs()){
        int mind = INF;
        for(int i = t; i != s; i = pre[i])
            mind = min(mind, res[pre[i]][i]);
        for(int i = t; i != s; i = pre[i])
        {
            res[pre[i]][i] -= mind;
            res[i][pre[i]] += mind;
        }
        maxFlow += mind;
    }
    return maxFlow;
}
int main()
{
    //freopen("in.txt", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--){
        memset(dif,0,sizeof(dif));
        memset(res,0,sizeof(res));
        scanf("%d%d", &n, &m);
        int total = 0;
        s = 0; t = n+1;
        for(int i = 0; i < m; i++)
        {
            int u,v,t;
            scanf("%d%d%d", &u,&v,&t);
            dif[u]++;   dif[v]--;
            if(t == 0) res[u][v] += 1;  //重边则可变方向+1
        }
        bool flag = true;
        for(int i = 1; i <= n; i++)
        {
            if(dif[i] > 0) {    //出度多-通过源点给予奇数入度
                res[s][i] = dif[i]/2;
                total += dif[i]/2;
            }
            if(dif[i] < 0) res[i][t] = -dif[i]/2;  //入度多-通过汇点给予奇数出度
            if(abs(dif[i]) % 2 == 1)
            {
                flag = false;
                break;
            }
        }
        (flag && EK() == total)? printf("possible\n"): printf("impossible\n");
    }
    return 0;
}
时间: 2024-10-03 22:37:51

ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)的相关文章

混合图的欧拉回路判定

对于有向图和无向图的欧拉回路判定,很容易做到.那对于混合图呢?? 混合图就是图中既存在无向边又存在有向边的图. 至于解法: 转载自这里 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路. 好了,现在每个点入度和出度之差均为偶数.那么将这个偶数除以2,得x.也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入.如果

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

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

poj1637 Sightseeing tour,混合图的欧拉回路问题,最大流解

混合图的欧拉回路问题 题目地址 欧拉回路问题 1 定义 欧拉通路 (Euler tour)--通过图中每条边一次且仅一次,并且过每一顶点的通路. 欧拉回路 (Euler  circuit)--通过图中每条边一次且仅一次,并且过每一顶点的回路. 欧拉图--存在欧拉回路的图.  2 无向图是否具有欧拉通路或回路的判定  G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点). G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点.  3 有向图是否具有欧拉通路或

欧拉回路、混合图的欧拉回路

欧拉回路 从一个点开始把图中的边恰好经过一次,再回到出发点,这样的路径就是欧拉回路. 如图就是一个欧拉回路 欧拉回路判定 不过怎么样的图中才存在欧拉回路呢? 欧拉回路分有向图和无向图两种: 有向图: 图中所有点的入度等于出度 无向图: 图中所有点的度数都为偶数 这还是很好理解的,不过你可能要问,怎么知道一个混合图中有没有欧拉回路呢? 混合图的欧拉回路 过程: 先将无向边随意定向 判断每个点的入度和出度是不是同奇偶,不同则无解 用一个超级原点向出度小于入度的点连一条容量为 \({|入度-出度| \

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

算法复习——欧拉回路混合图(bzoj2095二分+网络流)

题目: Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1出发,骑过每一座桥,到达每一个小岛,然后回到小岛1.霸中同学为了让YYD减肥成功,召唤了大风,由于是海上,风变得十分大,经过每一座桥都有不可避免的风阻碍YYD,YYD十分ddt,于是用泡芙贿赂了你,希望你能帮他找出一条承受的最大风力最小的路线. Input 输入:第一行为两个用空格隔开的整数

bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)

传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路,当且仅当图的所有顶点度数都为偶数且图连通.        有向图存在欧拉回路,当且仅当图的所有顶点入度等于出度且图连通. 那么我们怎么判断混合图的欧拉回路是否存在呢? 我们把无向边的边随便定向,然后计算每一个点的入度和出度.如果有某一个点的入度和出度之差是奇数,那么肯定不存在欧拉回路. 因为欧拉回路要求

HS BDC (hdu 3472 混合图的欧拉回路)

HS BDC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 974    Accepted Submission(s): 395 Problem Description IELTS is around the corner! love8909 has registered for the exam, but he still hasn

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