[USACO4.4]追查坏牛奶Pollutant Control
题目描述
你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶。很不幸,你发现这件事的时候,有三聚氰胺的牛奶已经进入了送货网。这个送货网很大,而且关系复杂。你知道这批牛奶要发给哪个零售商,但是要把这批牛奶送到他手中有许多种途径。送货网由一些仓库和运输卡车组成,每辆卡车都在各自固定的两个仓库之间单向运输牛奶。在追查这些有三聚氰胺的牛奶的时候,有必要保证它不被送到零售商手里,所以必须使某些运输卡车停止运输,但是停止每辆卡车都会有一定的经济损失。你的任务是,在保证坏牛奶不送到零售商的前提下,制定出停止卡车运输的方案,使损失最小。
输入格式
第一行: 两个整数N(2<=N<=32)、M(0<=M<=1000), N表示仓库的数目,M表示运输卡车的数量。仓库1代 表发货工厂,仓库N代表有三聚氰胺的牛奶要发往的零售商。 第2…M+1行: 每行3个整数Si,Ei,Ci。其中Si,Ei表示这 辆卡车的出发仓库,目的仓库。Ci(0 <= C i <= 2,000,000) 表示让这辆卡车停止运输的损失。
输出格式
两个整数C、T:C表示最小的损失,T表示在损失最小的前提下,最少要停止的卡车数。
样例 #1
样例输入 #1
4 5
1 3 100
3 2 50
2 4 60
1 2 40
2 3 80
样例输出 #1
60 1
提示
题目翻译来自NOCOW。
USACO Training Section 4.4
1、 最大流 = 最小割
2、 用 dinic 算法求出最大流
3、 然后剩下的残留网络, 将正边 edge[i] = 0 的边重新置值 为1, 正边不为0 的边重新重新置值inf
所有的反边 edge[i ^ 1] 置值为0。
重新跑一边 dinic ,得到的最大流就是 最小割的边数。
4、 样例 11 输入的边号 x, y 可能大于 n, 因此 每次输入 x, y ,都 n = max(n, max(x, y));
#include <bits/stdc++.h>
using namespace std;
const int N = 4010, M = 4010, inf = 2147483647;
int n, m;
int now[N]; //当前弧优化
int head[N], ver[M], edge[M], Next[M];
int s, t, tot, maxflow;
int d[N];
int a[N], b[N]; // 存边
void add(int x, int y, int