UVA1306 The K-League(最大流)
题面
有
n
n
n 支队伍进行比赛,每支队伍需要打的比赛数目相同。
每场比赛恰好一支队伍胜,另一支败。
给出每支队伍目前胜的场数
w
i
w_i
wi 和败的场数(没用),以及每两个队伍还剩下的比赛场数
a
i
,
j
a_{i,j}
ai,j,确定所有可能得冠军的球队(获胜场数最多的得冠军,可以并列)。
n
≤
25
n\leq 25
n≤25,所有整数不超过 100 。
题解
又是属于什么奇怪复杂度都能过的网络流题……
对于每两个队伍之间,新建一个点,从源点连来容量为
a
i
,
j
a_{i,j}
ai,j 的边,再与
i
i
i 和
j
j
j 的代表点分别连容量正无穷的边,表示这
a
i
,
j
a_{i,j}
ai,j 次比赛的胜利可以随意分配。
从源点向每个
i
i
i 的代表点连容量为
w
i
w_i
wi 的边,表示最初赢了
w
i
w_i
wi 场(如果不懒的话其实可以不用建这条边)。
从每个
i
i
i 的代表点向汇点连容量为
L
i
L_i
Li 的边,表示这个点赢不超过
L
i
L_i
Li 场是我们可以接受的。
若源点连出的边都满流,则方案合法,当我们把
L
i
L_i
Li 都设成正无穷时,我们就一定能找到一种最终获胜场数的可行解。
如何判断某个队伍是否可夺冠呢?我们得主动地使之获胜场数最大化,同时让其他队伍获胜场数不超过它,也就是假设
x
x
x 的最大获胜场数是
M
x
M_x
Mx ,存在方案使得其他团队的获胜场次不超过
M
x
M_x
Mx 。
那么我们就先令
L
x
=
+
∞
,
∀
i
≠
x
,
L
i
=
0
L_x=+\infty,\forall i\not=x,L_i=0
Lx=+∞,∀i=x,Li=0 ,然后跑网络流,这时得到的流量就是
M
x
M_x
Mx ,然后令
L
x
=
+
∞
,
∀
i
≠
x
,
L
i
=
M
x
L_x=+\infty,\forall i\not=x,L_i=M_x
Lx=+∞,∀i=x,Li=Mx ,跑网络流,看是否源点满流。
CODE
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 1055
#define MAXM 40005
#define LL long long
#define DB double
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
LL read() {
LL f=1,x=0;int s = getchar();
while(s < '0' || s > '9') {if(s<0)return -1;if(s=='-')f=-f;s=getchar();}
while(s >= '0' && s <= '9') {x = (x<<3) + (x<<1) + (s^48);s = getchar();}
return f * x;
}
void putpos(LL x) {if(!x)return ;putpos(x/10);putchar((x%10)^48);};
void putnum(LL x) {
if(!x) {putchar('0');return ;}
if(x<0) putchar('-'),x = -x;
return putpos(x);
}
void AIput(LL x,int c) {putnum(x);putchar(c);}
int n,m,s,o,k;
int ip[30],ie[30][30],ep[30];
int S,T,cnt;
int hd[MAXN],v[MAXM],nx[MAXM],w0[MAXM],w[MAXM],cne,rev[MAXM];
int ins(int x,int y,int z) {
nx[++cne]=hd[x]; v[cne]=y; w0[cne]=z; hd[x]=cne;
nx[++cne]=hd[y]; v[cne]=x; w0[cne]=0; hd[y]=cne;
rev[cne] = cne-1; rev[cne-1] = cne; return cne-1;
}
int hd2[MAXN],d[MAXN];
bool bfs() {
for(int i = 1;i <= cnt;i ++) {
d[i] = -1; hd2[i] = hd[i];
}
queue<int> b;
b.push(S);d[S] = 0;
while(!b.empty()) {
int t = b.front();b.pop();
if(t == T) return 1;
for(int i = hd[t];i;i = nx[i]) {
if(d[v[i]] < 0 && w[i] > 0) {
d[v[i]] = d[t] + 1;
b.push(v[i]);
}
}
}return 0;
}
int dfs(int x,int fw) {
if(x == T || !fw) return fw;
int nw = 0;
for(int i = hd2[x];i;i = nx[i]) {
if(d[v[i]] == d[x] + 1 && w[i] > 0) {
int nm = dfs(v[i],min(w[i],fw-nw));
nw += nm; w[i] -= nm; w[rev[i]] += nm;
if(nw == fw) break;
}
hd2[x] = nx[i];
}
return nw;
}
int dinic() {
int ans = 0;
while(bfs()) {
ans += dfs(S,0x7f7f7f7f);
}return ans;
}
void initdinic() {
for(int i = 1;i <= cne;i ++) w[i] = w0[i];
}
int NWP() {hd[++ cnt] = 0; return cnt;}
int main() {
int TS = read();
while(TS --) {
n = read();
cne = 0; cnt = 0;
S = NWP();T = NWP();
int sm = 0;
for(int i = 1;i <= n;i ++) {
ip[i] = NWP();
s = read();o = read();
ins(S,ip[i],s);
sm += s;
}
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) {
s = read();
if(j < i) {
sm += s;
ie[i][j] = ie[j][i] = NWP();
ins(S,ie[i][j],s);
ins(ie[i][j],ip[i],0x3f3f3f3f);
ins(ie[i][j],ip[j],0x3f3f3f3f);
}
}
}
for(int i = 1;i <= n;i ++) {
ep[i] = ins(ip[i],T,0);
}
int fl = 0;
for(int i = 1;i <= n;i ++) {
w0[ep[i]] = 0x3f3f3f3f;
initdinic();
int lm = dinic();
for(int j = 1;j <= n;j ++) {
if(j != i) w[ep[j]] += lm;
}
int tt = lm + dinic();
if(tt == sm) {
if(fl) putchar(' ');
putnum(i); fl = 1;
}
w0[ep[i]] = 0;
}
ENDL;
}
return 0;
}
UVA1306 The K-League(最大流)的更多相关文章
- POJ - 2516 Minimum Cost 每次要跑K次费用流
传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...
- poj-2516.minimum cost(k次费用流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19883 Accepted: 7055 Des ...
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙
/** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...
- 【wikioi】1034 家园(最大流+特殊的技巧)
http://wikioi.com/problem/1034/ 太神了这题. 其实一开始我以为是费用流,但是总感觉不对. 原因是我没看到一句话,特定的时刻到达特定的点!! 也就是说,并不是每艘船每次都 ...
- BZOJ 2324 营救皮卡丘(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2324 题意:n+1个城市(0到n).初始时K个 人都在0城市.城市之间有距离.要求(1) ...
- hdu3081 Marriage Match II(二分+并查集+最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意: n个女生与n个男生配对,每个女生只能配对某些男生,有些女生相互是朋友,每个女生也可以跟她 ...
- POJ 2516 Minimum Cost (费用流)
题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...
- 【费用流】【CODEVS】1227 方格取数2
[算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...
- BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...
随机推荐
- 多路分支、for循环
多路分支 多路分支也叫做switch语句,它的格式: switch (控制表达式){ case 条件: 输出....} switch 可以看成一种跳转,每当我们满足跳转就会跳转到响应的位置,接下我们写 ...
- 万字剖析Ribbon核心组件以及运行原理
大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...
- .Net CLR GC动态获取函数头地址,C++的骚操作(慎入)
前言: 太懒了,从没有在这里正儿八经的写过文章.看到一些人的高产,真是惭愧.决定稍微变得不那么懒.如有疏漏,请指正. .net的GC都谈的很多了,本篇主要是剑走偏锋,聊聊一些个人认为较为核心的细节方面 ...
- 【主流技术】ElasticSearch 在 Spring 项目中的实践
前言 ElasticSearch简称es,是一个开源的高扩展的分布式全文检索引擎. 它可以近乎实时的存储.检索数据,其扩展性很好,ElasticSearch是企业级应用中较为常见的技术. 下面和大家分 ...
- BUUCTF-被劫持的礼物
被劫持的礼物 看提示用wireshark打开,找登陆流量包,过滤http .login目录的 账号密码加一起MD5小写即可. 1d240aafe21a86afc11f38a45b541a49
- Vue 安装 vue的基本使用 vue的初步使用步骤
1. 资源: https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5 进入官网学习 2. 点击安装,要把vue下载到本地文件的根目录中,不要选择压缩版的,这 ...
- 『现学现忘』Docker基础 — 39、实战:自定义Tomcat9镜像
目录 1.目标 2.准备 3.编写Dockerfile文件 4.构建镜像 5.启动镜像 6.验证容器是否能够访问 7.向容器中部署WEB项目,同时验证数据卷挂载 (1)准备一个简单的WEB项目 (2) ...
- RPA人力资源简历筛选机器人
简历自动筛选及分析机器人,支持前程无忧.猎聘 1.自动登录招聘网站 2.自动填充简历筛选条件 3.RPA依次读取所筛选的简历信息 4.自动将简历数据复制到本地文档中 5.完成简历信息收集及分析表 6. ...
- 利用kubernetes资源锁完成自己的HA应用
Backgroud 前一章中,对kubernetes的选举原理进行了深度剖析,下面就通过一个example来实现一个,利用kubernetes提供的选举机制完成的高可用应用. 对于此章需要提前对一些概 ...
- PowerDesigner安装
1.双击安装包进行安装 2.选择PRC 3.一路往下就行 4.将下图文件夹中的内容覆盖安装的内容 ----------------------------------------分割线 5.安装成功 ...