LG1344 「USACO4.4」Pollutant Control 最小割

问题描述

LG1344


题解

我太菜了,我一开始竟然没有看出这是个最小割裸题。。。

两个询问。

第一个询问,直接跑最小割就好了。

第二个询问,建图的时候边权建 \(1\) ,代表割掉这条边需要 \(1\) 的代价。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=37;
const int maxm=2007;

int n,m,S,T;

struct Graph{
    int Head[maxn],to[maxm],Next[maxm],w[maxm],tot=1;
    Graph(){
        memset(Head,0,sizeof(Head));
        memset(Next,0,sizeof(Next));
    }
    void add(int x,int y,int z){
        to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
    }
}G[2];

int d[maxn];

bool bfs(int gp){
    memset(d,0,sizeof(d));
    queue<int>q;q.push(S);d[S]=1;
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=G[gp].Head[x];i;i=G[gp].Next[i]){
            int y=G[gp].to[i];
            if(d[y]||!G[gp].w[i]) continue;
            q.push(y);d[y]=d[x]+1;
            if(y==T) return true;
        }
    }
    return false;
}

int dfs(int x,int flow,int gp){
    if(x==T) return flow;
    int rest=flow;
    for(int i=G[gp].Head[x];i&&rest;i=G[gp].Next[i]){
        int y=G[gp].to[i];
        if(d[y]!=d[x]+1||!G[gp].w[i]) continue;
        int k=dfs(y,min(rest,G[gp].w[i]),gp);
        if(!k) d[y]=0;
        else{
            G[gp].w[i]-=k,G[gp].w[i xor 1]+=k;
            rest-=k;
        }
    }
    return flow-rest;
}

int ans;

int main(){
    read(n);read(m);
    for(int i=1,x,y,z;i<=m;i++){
        read(x);read(y);read(z);
        G[1].add(x,y,z);G[1].add(y,x,0);
        G[0].add(x,y,1);G[0].add(y,x,0);
    }
    S=1,T=n;
    while(bfs(1)){
        int t;
        while(t=dfs(S,0x3f3f3f3f,1)) ans+=t;
    }
    printf("%d ",ans);ans=0;
    while(bfs(0)){
        int t;
        while(t=dfs(S,0x3f3f3f3f,0)) ans+=t;
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/liubainian/p/11779705.html

时间: 2024-08-30 13:10:32

LG1344 「USACO4.4」Pollutant Control 最小割的相关文章

「CQOI2016」不同的最小割

「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> #include <cstring> #include <cstdio> #define rg register #define file(x) freopen(x".in", "r", stdin), freopen(x".out&q

Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型

问题描述 提供中文版本好评,一直以为 Rin 是题目名字... pdf submit 题解 参考了 东营市胜利第一中学姜志豪 的<网络流的一些建模方法>(2016年信息学奥林匹克中国国家队候选队员论文) 读了之后很有感触,这里节选一段话: 最小割模型的本质是将点的集合 \(V\) 划分为两个点集 \(S,T\) ,使得 \(S \in S,T \in T\) ,且 \(S∩T=?\) 之前对最小割中边权为 \(INF\) 的边,一直理解为不允许被割,现在从另一个角度来认识,就是保证这条边所联通

HDU 4289 Control 最小割

Control 题意:有一个犯罪集团要贩卖大规模杀伤武器,从s城运输到t城,现在你是一个特殊部门的长官,可以在城市中布置眼线,但是布施眼线需要花钱,现在问至少要花费多少能使得你及时阻止他们的运输. 题解:裸的最小割模型,最小割就是最大流,我们把点拆成2个点,然后将原点与拆点建边,流量为在城市建立眼线的费用,然后拆点为出点,原点为入点,将可以到达的城市之间建流量为无穷的边. 最后求出s 到 t的拆点的最大流 那么就是这个题目的答案了. 代码: 1 #include<bits/stdc++.h>

HDU-4289 Control(最小割,拆点)

题目链接:HDU-4289 Control 题意 恐怖分子计划将武器从城市$S$运输到城市$D$,现在我们知道$S$和$D$,知道城市网络中存在的路径(无向边),知道封锁每个城市各自需要的代价,我们可以对任意城市进行封锁,恐怖分子到达被封锁的城市就会被抓捕,求抓捕所有恐怖分子需要的最小代价. 思路 显然这是一个最小割问题,但代价是点权而不是边权,所以需要对每个城市结点拆成入点和出点,入点向出点连边,边权为对应城市结点的点权,这样就将点权代价转换为边权代价.不同城市之间的双向路径$(u,v)$,$

hdu-4289.control(最小割 + 拆点)

Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5636    Accepted Submission(s): 2289 Problem Description You, the head of Department of Security, recently received a top-secret informati

hdu4289 Control --- 最小割,拆点

给一个无向图,告知敌人的起点和终点,你要在图上某些点安排士兵,使得敌人无论从哪条路走都必须经过士兵. 每个点安排士兵的花费不同,求最小花费. 分析: 题意可抽象为,求一些点,使得去掉这些点之后,图分成了两部分,敌人的起点和终点分别在这两部分里.即求最小割. 问题是最小割是边,这里把点拆成两个,自己到自己连边,边权为该点点权.其他题目给的边照连就可以了. 为了方便,对于点i,拆成(i,i+n). 因此,对于题目给的边(a,b),就连双向边边:(a+n,b,inf).(b+n,a,inf) #inc

HDU - 4289 Control (最小割 MCMF)

题目大意:有一个间谍要将一些机密文件送到目的地 现在给出间谍的初始位置和要去的目的地,要求你在间谍的必经路上将其拦获且费用最小 解题思路:最小割最大流的应用,具体可以看网络流–最小割最大流 建图的话 超级源点–起始城市,容量为INF 城市拆成两点(u, v),容量为监视该城市的代价 能连通的城市连接,容量为INF 目的地和超级汇点相连,容量为INF #include <cstdio> #include <cstring> #include <algorithm> #in

USACO 4.4 Pollutant Control (网络流求最小割割集)

Pollutant ControlHal Burch It's your first day in Quality Control at Merry Milk Makers, and already there's been a catastrophe: a shipment of bad milk has been sent out. Unfortunately, you didn't discover this until the milk was already into your del

LiberOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 在一个有 m×n m \times nm×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 2 22 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入格式 文件第 1 11 行有 2 22 个正整数 m mm 和 n nn,分别表示棋盘的行数和列数