http://cojs.tk/cogs/problem/problem.php?pid=894

题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割。(n<=32, m<=1000)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Gr {
static const int N=33, M=1005, oo=~0u>>1;
struct E { int next, from, to, cap; }e[M<<1];
int ihead[N], cnt, d[N], p[N], gap[N], cur[N];
Gr() { memset(ihead, 0, sizeof ihead); cnt=1; }
Gr & operator=(const Gr &g) {
memcpy(ihead, g.ihead, sizeof g.ihead);
memcpy(e, g.e, sizeof g.e);
cnt=g.cnt;
return *this;
}
void add(int u, int v, int cap) {
e[++cnt]=(E){ihead[u], u, v, cap}; ihead[u]=cnt;
e[++cnt]=(E){ihead[v], v, u, 0}; ihead[v]=cnt;
}
ll isap(int s, int t, int n) {
for(int i=0; i<=n; ++i) d[i]=0, gap[i]=0, cur[i]=ihead[i];
gap[0]=n; int u=s, i, f; ll ret=0;
while(d[s]<n) {
for(i=cur[u]; i; i=e[i].next) if(e[i].cap && d[e[i].to]+1==d[u]) break;
if(i) {
cur[u]=i; p[e[i].to]=i; u=e[i].to;
if(u==t) {
for(f=oo; u!=s; u=e[p[u]].from) f=min(f, e[p[u]].cap);
for(u=t; u!=s; u=e[p[u]].from) e[p[u]].cap-=f, e[p[u]^1].cap+=f;
ret+=f;
}
}
else {
if(!(--gap[d[u]])) break;
d[u]=n; cur[u]=ihead[u];
for(i=ihead[u]; i; i=e[i].next) if(e[i].cap && d[e[i].to]+1<d[u]) d[u]=d[e[i].to]+1;
++gap[d[u]];
if(u!=s) u=e[p[u]].from;
}
}
return ret;
}
}g, G;
int n, m, arr[Gr::M], tot;
int main() {
freopen("milk6.in", "r", stdin);
freopen("milk6.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i=1; i<=m; ++i) {
int x, y, cap;
scanf("%d%d%d", &x, &y, &cap);
g.add(x, y, cap*(m+1)+1);
}
ll ans=0, f;
G=g;
f=G.isap(1, n, n);
for(int i=1; i<=m; ++i) {
int id=i<<1, cap=g.e[id].cap;
g.e[id].cap=g.e[id^1].cap=0;
G=g;
ll mn=G.isap(1, n, n);
if(mn+cap==f) arr[++tot]=i, ans+=(cap-1)/(m+1), f=mn;
else g.e[id].cap=cap, g.e[id^1].cap=0;
}
printf("%lld %d ", ans, tot);
for(int i=1; i<=tot; ++i) printf("%d ", arr[i]);
return 0;
}

  

神题...在uoj群被神犇们吊打&裱

= =这么水的usaco training我都不会做= =

首先求最少边的话可以直接将权值变为$w*(m+1)+1$,然后就是最小割。理由很简单,最小割是$\sum_{i为一条割边} (w[i]*(m+1)+1) = (m+1)\sum_{i为一条割边} w[i] + c$首先我们分离出了原来没有改变权值的割,显然这样做$\sum_{i为一条割边} w[i]$是原图的最小割,因为乘上$(m+1)$后始终大于边数,和边数$c$都是常数= =。其次我们在求改变权值后的最小割后,比较完原图最小割后还比较了右边常数$c$,而$c$正是割边数。而$(m+1)$这个乘数也是因为割边数<=m最大可能到了m,可能会影响到原来图上的边权值,所以乘上$(m+1)$来消除影响。

那么现在问题变为求普通的字典序最少的最小割。我们考虑从小到大枚举边然后删边。

如果删掉$i$这条边时,最小割变小的值恰好为$i$改变后的权值,那么显然$i$是割边,此时维护的最小割减小,删掉$i$不恢复。

否则把删掉的边恢复。

【COGS】894. 追查坏牛奶的更多相关文章

  1. 【Luogu1344】追查坏牛奶(最小割)

    [Luogu1344]追查坏牛奶(最小割) 题面 洛谷 题解 裸的最小割,但是要求边的数量最小. 怎么办呢?给每条边的权值额外加上一个很大的值就了. #include<iostream> ...

  2. 洛谷 P1344 [USACO4.4]追查坏牛奶Pollutant Control 解题报告

    P1344 [USACO4.4]追查坏牛奶Pollutant Control 题目描述 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候 ...

  3. USACO Section 4.4 追查坏牛奶Pollutant Control

    http://www.luogu.org/problem/show?pid=1344 题目描述 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件 ...

  4. 洛谷 P1344 [USACO4.4]追查坏牛奶Pollutant Control

    题目描述 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候,有三聚氰胺的牛奶已经进入了送货网.这个送货网很大,而且关系复杂.你知道这批牛 ...

  5. USACO 4.4.2 追查坏牛奶 oj1341 网络流最小割问题

    描述 Description 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候,有三聚氰胺的牛奶已经进入了送货网.这个送货网很大,而且关 ...

  6. 【题解】Luogu P1344 [USACO4.4]追查坏牛奶Pollutant Control

    原题传送门 看到这种题,应该一眼就能知道考的是最小割 没错这题就是如此简单,跑两遍最大流(最小割=最大流),一次边权为题目所给,一次边权为1 还有一种优化,优化后只需跑一次最大流,把每条边的权值改成w ...

  7. Luogu1344 追查坏牛奶 最小割

    题目传送门 题意:给出$N$个节点$M$条边的有向图,边权为$w$,求其最小割与达到最小割的情况下割掉边数的最小值.$N \leq 32,M \leq 1000,w\leq 2 \times 10^6 ...

  8. luogu P1344 [USACO4.4]追查坏牛奶Pollutant Control

    传送门 要求断掉某些边使得两个点不连通,显然是最小割 但是要求选的边数尽量少,,, 可以考虑修改边权(容量),即把边权\(c\)改成\(c*(m+1)+1\) 没了 // luogu-judger-e ...

  9. [USACO4.4]追查坏牛奶Pollutant Control

    题目链接:ヾ(≧∇≦*)ゝ Solution: 第一问很好解决,根据网络流:最大流=最小割定理,我们可以轻松求出. 至于第二问,我们不妨把每一条边乘上一个大于1000的数再加上1. 这样的话,对于最小 ...

随机推荐

  1. Linux 下 Console / 控制台 复制粘贴快捷键

    Linux下复制粘贴快捷键 1. 在终端下: 复制命令:Ctrl + Shift + C  组合键. 粘贴命令:Ctrl + Shift + V  组合键. 2. 在控制台下: 复制命令:Ctrl + ...

  2. centos安装oracle 11g 完全图解

    摘要: 说明: Linux服务器操作系统:CentOS 5.8 32位(注意:系统安装时请单独分区/data用来安装oracle数据库) Linux服务器IP地址:192.168.21.150 Ora ...

  3. jqueryEasyUI:tabs扩展:给tabs组件绑定双击事件 分类: JqueryEasyUI 2014-09-29 14:36 537人阅读 评论(0) 收藏

    实现代码: $.extend($.fn.tabs.methods, { /** * 绑定双击事件 * @param {Object} jq * @param {Object} caller 绑定的事件 ...

  4. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  5. WebView中实现文件下载功能

      WebView控制调用相应的WEB页面进行展示.当碰到页面有下载链接的时候,点击上去是一点反应都没有的.原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置Web ...

  6. 自己yy的Splay

    #include <iostream> #include <cstdio> #include <queue> using namespace std; ; stru ...

  7. json方式的面向对象

    json方式只适合于一个对象. var p1 = { name:"香菇", sex :"女", dreamdu: { URL: "www.dreamd ...

  8. WebAPI接口调用身份验证

    Common public interface ICacheWriter { void AddCache(string key, object value, DateTime expDate); vo ...

  9. SQL Server2008函数大全(完整版)

    SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合. 1. 字符串函数 函数 名称 参数 示例 说明 ascii(字符串表达式) select ascii('abc') 返回 97 返 ...

  10. JDK AIO编程

    NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供两种方式获取获取操作结果. 通过java.util.concurrent.Future类来表示异步操作的结 ...