Uva 10480 Sabotage 最大流

表示自从学了网络流,就基本上是一直用dinic

这个题一看就是用最大流,作为常识,两个点之间的最大流等于最小割

但是这个题需要输出割边,然后我就不会了,dinic判流量我觉得也可做,但是一直wa

然后看了看网上的代码,居然用EK暴力,仰慕不已,不过一看数据范围(EK很合理嘛!!!)

关键是用EK可以很容易判断割边

感悟:还是too young too simple 不过让我找回了最初学网络流时的感觉

分析见这里:无限仰慕美女大神

http://blog.csdn.net/ac_lion/article/details/8620676

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
typedef long long LL;
const int N=55;
const int INF=0x3f3f3f3f;
int cap[N][N],flow[N][N],n,m;
int p[N],a[N],x[N*10],y[N*10];
void maxflow(){
    queue<int>q;
    memset(flow,0,sizeof(flow));
    int f=0;
    while(1){
        memset(a,0,sizeof(a));
        while(!q.empty())q.pop();
        a[1]=INF;q.push(1);
        while(!q.empty()){
            int u=q.front();q.pop();
            if(u==2)break;
            for(int v=1;v<=n;++v)
              if(!a[v]&&flow[u][v]<cap[u][v]){
                p[v]=u;a[v]=min(a[u],cap[u][v]-flow[u][v]);
                q.push(v);
              }
        }
        if(!a[2])break;
        for(int u=2;u!=1;u=p[u]){
            flow[p[u]][u]+=a[2];
            flow[u][p[u]]-=a[2];
        }
        f+=a[2];
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        if(!n&&!m)break;
        memset(cap,0,sizeof(cap));
        for(int i=0;i<m;++i){
          int w;scanf("%d%d%d",&x[i],&y[i],&w);
          cap[x[i]][y[i]]=cap[y[i]][x[i]]=w;
        }
        maxflow();
        for(int i=0;i<m;++i){
          if((!a[x[i]]&&a[y[i]])||(a[x[i]]&&!a[y[i]]))
            printf("%d %d\n",x[i],y[i]);
        }
        printf("\n");
    }
    return 0;
}

时间: 2024-10-10 21:28:29

Uva 10480 Sabotage 最大流的相关文章

UVA - 10480 Sabotage 最小割,输出割法

UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解:建图直接按给你的图建一下,然后呢跑一下最大流,我们就知道了最小割是多少,答案就是最小割了  . 现在要求输出割法.我们从s开始往前跑,如果某条正向边有流量,我们就按着这条边继续往外走,知道无法再走,把所有经历过的点都染一下色.最后看所有的边,是不是有一头是染色了,另一头没有染色,如果是,这条边就是割

UVa 10480 Sabotage

10480  Sabotage:The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebellion.Because of the enormous disturbances this is causing in world economy, an imperialist militarysuper power has decided to invade the

J - Sabotage - UVA 10480(最大流)

题目大意:旧政府有一个很庞大的网络系统,可以很方便的指挥他的城市,起义军为了减少伤亡所以决定破坏他们的网络,使他们的首都(1号城市)和最大的城市(2号城市)不能联系,不过破坏不同的网络所花费的代价是不同的,现在起义军想知道最少花费的代价是多少,输出需要破坏的线路. 输入:第一行输入一个N和M,表示城市数和线路数,下面M行,每行有三个整数,表示从破坏城市u到v的线路花费是w. 分析:很明显的最小割问题,我们知道有向图(题目给的是无向图,所以需要建立反边)的最小割等于最大流,所以只需要求出来最大流即

UVA - 10480 Sabotage (Dinic)

The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebel-lion. Because of the enormous disturbances this is causing in world economy, an imperialist militarysuper power has decided to invade the country and r

Sabotage 【UVA - 10480】【最大流割边】

题目链接 很容易会想到是最大流建边,但是同样的这里有坑点,就是有的人去输出边的时候,去把残余网络的流为0的边给输出了,其实不然,我们应当输出的是那些最后跑到深度为0的不能再走下去的点,只要把他们割了,就一定会是最优的解. #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm

UVA 563 Crimewave (最大流,拆点)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=504  Crimewave  Nieuw Knollendam is a very modern town. This becomes clear already when looking at the layout of its map, which is just a rectangula

UVA 10779 (最大流)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33631 题目大意:Bob有一些贴纸,他可以和别人交换,他可以把自己独有的贴纸拿出去,也可以把重复的贴纸拿出去(有时候把独有的贴纸而不是重复的贴纸拿出去能换到更多贴纸). Bob的朋友也有一些贴纸,但是他们只会拿自己重复的贴纸和Bob换,而且换的是自己没有的贴纸. 求Bob最后最多能有多少种贴纸. 解题思路: 题目意思很明确了.就算把重复的贴纸拿出去也不一定最优,贪

uva 753(网络流最大流)

网络流最大流问题,这里使s=0,使s与所有的插头相连,最大通量为1,然后插头和转换器相连,最大通量为1,转换器和转换器相连,因为有无限个,所以为inf,然后转换器和插座连,最大通量为1,插座和t相连,最大通量为1,注意这里的插头插座都是string,不是char,比如插头可以是AB(我日李赖赖,写了我一上午!!!!! #include <iostream> #include <cstring> #include <cstdio> #include <algorit

训练指南 网络流题集

layout: post title: 训练指南 网络流题集 author: "luowentaoaa" catalog: true mathjax: true tags: - 网络流 - 图论 - 训练指南 A.UVA - 11248 (最大流,最小割) UVA - 11248 Frequency Hopping 题意 给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流. 思路 先求一遍最大流,如