题面

n

n

n 支队伍进行比赛,每支队伍需要打的比赛数目相同。

每场比赛恰好一支队伍胜,另一支败。

给出每支队伍目前胜的场数

w

i

w_i

wi​ 和败的场数(没用),以及每两个队伍还剩下的比赛场数

a

i

,

j

a_{i,j}

ai,j​,确定所有可能得冠军的球队(获胜场数最多的得冠军,可以并列)。

n

25

n\leq 25

n≤25,所有整数不超过 100 。

题解

又是属于什么奇怪复杂度都能过的网络流题……

  1. 对于每两个队伍之间,新建一个点,从源点连来容量为

    a

    i

    ,

    j

    a_{i,j}

    ai,j​ 的边,再与

    i

    i

    i 和

    j

    j

    j 的代表点分别连容量正无穷的边,表示这

    a

    i

    ,

    j

    a_{i,j}

    ai,j​ 次比赛的胜利可以随意分配。

  2. 从源点向每个

    i

    i

    i 的代表点连容量为

    w

    i

    w_i

    wi​ 的边,表示最初赢了

    w

    i

    w_i

    wi​ 场(如果不懒的话其实可以不用建这条边)。

  3. 从每个

    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(最大流)的更多相关文章

  1. POJ - 2516 Minimum Cost 每次要跑K次费用流

    传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...

  2. poj-2516.minimum cost(k次费用流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19883   Accepted: 7055 Des ...

  3. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

  4. 【wikioi】1034 家园(最大流+特殊的技巧)

    http://wikioi.com/problem/1034/ 太神了这题. 其实一开始我以为是费用流,但是总感觉不对. 原因是我没看到一句话,特定的时刻到达特定的点!! 也就是说,并不是每艘船每次都 ...

  5. BZOJ 2324 营救皮卡丘(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2324 题意:n+1个城市(0到n).初始时K个 人都在0城市.城市之间有距离.要求(1) ...

  6. hdu3081 Marriage Match II(二分+并查集+最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意: n个女生与n个男生配对,每个女生只能配对某些男生,有些女生相互是朋友,每个女生也可以跟她 ...

  7. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  8. 【费用流】【CODEVS】1227 方格取数2

    [算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...

  9. BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...

随机推荐

  1. Vue搭建后台系统需要做的几点(持续更新中)

    前言 持续更新 一.UI框架 推荐 Elemnet ui 二.图表 vue-schart npm install vue-schart -S <template> <div id=& ...

  2. Linux安装Anaconda3完整教程

    Linux安装Anaconda3完整教程 欢迎关注H寻梦人公众号 相关链接 官方安装Anaconda3教程 [手把手教你]如何在Linux系统搭建jupyter notebook CentOS8.2安 ...

  3. PotPlayer播放百度云盘视频

    需要的工具 PotPlayer.油猴tampermonkey.坚果(这个不用下载,有个账号就行) 下载地址:百度网盘 步骤 安装油猴tampermonkey 拖拽Tampermonkey_4.14.c ...

  4. 原生实现.NET5.0+ 自定义日志

    一.定义一个静态类 声明一个 ReaderWriterLockSlim 对象 用于并发控制 1 /// <summary> 2 /// IO锁 3 /// </summary> ...

  5. 我不就是吃点肉,应该没事吧——爬取一座城市里的烤肉店数据(附完整Python爬虫代码)

    写在前面的一点屁话: 对于肉食主义者,吃肉简直幸福感爆棚!特别是烤肉,看着一块块肉慢慢变熟,听着烤盘上"滋滋"的声响,这种期待感是任何其他食物都无法带来的.如果说甜点是" ...

  6. 再测云原生数据库性能:PolarDB依旧最强,TDSQL-C、GaussDB变化不大

    1.摘要 近期,腾讯云数据库在文章「腾讯云TDSQL-C重磅升级,性能全面领跑云原生数据库市场」中提到,某些场景下性能有非常大的提升,且超过国内某橙色云厂商.恰好,在5月份,我们对各个厂商的云原生数据 ...

  7. 从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能

    目录 坐标边界查询工具:AreaCity-Query-Geometry 性能测试数据 测试一:Init_StoreInWkbsFile 内存占用很低(性能受IO限制) 测试二:Init_StoreIn ...

  8. hs-black 杂题选讲

    [POI2011]OKR-Periodicity 考虑递归地构造,设 \(\text{solve(s)}\) 表示字典序最小的,\(\text{border}\) 集合和 \(S\) 的 \(\tex ...

  9. Ajax:异步的JS和XML

    1.Ajax1) AJAX 是 Asynchronous JavaScript And XML 的简称.直译为,异步的JS和XML.2) AJAX的实际意义是,不发生页面跳转.异步载入内容并改写页面内 ...

  10. Collection集合概述和集合框架介绍avi

    集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢?· ~集合︰集合是java中提供的一种容器,可以用来存储多个数据集合和数组既然都是容器,它 ...