uva1306 - The K-League 网络流

网络流和棒球赛淘汰问题 公平分配模板 足球联赛 UVa1306 The K-League 网络流和棒球赛淘汰问题     1996 年 9 月 10 日,《旧金山纪事报》的体育版上登载了《巨人队正式告别 NL 西区比赛》一文,宣布了旧金山巨人队输掉比赛的消息。当时,圣地亚哥教士队凭借 80 场胜利暂列西区比赛第一,旧金山巨人队只赢得了 59 场比赛,要想追上圣地亚哥教士队,至少还得再赢 21 场比赛才行。然而,根据赛程安排,巨人队只剩下 20 场比赛没打了,因而彻底与冠军无缘。 阅读详情

Supporters for the professional soccer clubs participating in the K-League, formerly the Korea Professional Soccer League, hold orderly and organized cheering, as did the Red Devils, the official supporters for the Korean national soccer team during the 2002 Korea-Japan World Cup. After many games of this season have been played, the supporters may wonder whether the team S they are backing can still win the championship. In other words, can winners be assigned for the remaining games so that no team ends with more victories than S? Two or more teams can win the championship jointly.


You are given the current number of wins and defeats, wi and di, for every team i, 1$ \le$i$ \le$n, and theremaining number, ai, j, of games to be played between every pair of teams i and j, 1$ \le$i, j$ \le$n, where n is the number of teams. The teams are numbered 1, 2,..., n . You are to find all teams that have a possibility of winning the championship. Every team has to play the same number games during the season. For simplicity, we assume that there are no draws, that is, every game has a winner and a loser.

Input 

The input consists of T test cases. The number of test cases (T) is given in the first line of the input file.


Each test case consists of three lines: the first line has an integer n(1$ \le$n$ \le$25), that represents the number of teams in the test case; the second line contains 2n nonnegative integers w1, d1, w2, d2,..., wn, dn, each at most 100, where wi and di are the current numbers of wins and defeats for team i, respectively; the third line contains n2 nonnegative integers a1, 1, a1, 2,..., a1, n, a2, 1, a2, 2,..., a2, n, ... , an, 1, an, 2,..., an, n, each at most 10, where ai, j is the remaining number of games to be played between teams i and j. For all i and j, ai, j is equal to aj, i. If i = j, then ai, j = 0. The integers given in a line are delimited by one or more spaces.

Output 

Print exactly one line for each test case. The line should contain all teams that have a possibility of winning the championship, in an increasing order of team numbers.

Sample Input 

3                                                   
3                                                   
2 0 1 1 0 2                                         
0 2 2 2 0 2 2 2 0 
3 
4 0 2 2 0 4 
0 1 1 1 0 1 1 1 0 
4 
0 3 3 1 1 3 3 0 
0 0 0 2 0 0 1 0 0 1 0 0 2 0 0 0

Sample Output 

1 2 3 
1 2 
2 4

  有N支队伍进行比赛,每支队伍需要打的比赛数目相同。每场比赛一个队伍胜,一个队伍败。给出每支队伍目前胜的场数和败的场数,以及每个队伍还剩下的比赛场数,输出所有可能得冠军的球队,可以并列。

  对于第i支队伍,让它在剩下的比赛中全部获胜,这时i获胜的总场数设为total,判断剩下队伍获胜场数是否能都不超过total。

  建图:对于每量支队伍(u,v)构造一个X节点,从S引一条弧容量为这两支队伍还需要比赛的场数。对每支队伍u构造一个Y节点,到T的容量为total-win(u),win(u)是已经获胜的场数。然后再把每个节点(u,v)到u和v各连一条弧,容量为INF。

  如果从S出发的所有弧满载说明队伍i能获得冠军。因为这时节点i到T可以满流,说明i剩下的场数可以全胜,并且可以找到对应的结果使其他队伍获胜的次数都不超过total。

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<algorithm>
#define eps 1e-9
#define INF 0x3f3f3f3f
#define MAXN 700
#define MAXM 55
#define MAXNODE 100010*4
#define MOD 999983
typedef long long LL;
using namespace std;
int T,N,w[30],d[30],a[30][30];

struct Edge{
    int from,to,cap,flow;
};
struct Dinic{
    int n,m,s,t;
    vector<Edge> edges;
    vector<int> G[MAXN];
    bool vis[MAXN];
    int d[MAXN];
    int cur[MAXN];

    void clear_all(int n){
        for(int i=0;i<n;i++) G[i].clear();
        edges.clear();
    }
    void clear_nodes(int a,int b){
        for(int i=a;i<b;i++) G[i].clear();
    }
    void add_edge(int from,int to,int cap){
        edges.push_back((Edge){from,to,cap,0});
        edges.push_back((Edge){to,from,0,0});
        m=edges.size();
        G[from].push_back(m-2);
        G[to].push_back(m-1);
    }
    bool BFS(){
        memset(vis,0,sizeof(vis));
        queue<int> q;
        q.push(s);
        d[s]=0;
        vis[s]=1;
        while(!q.empty()){
            int x=q.front();
            q.pop();
            int len=G[x].size();
            for(int i=0;i<len;i++){
                Edge& e=edges[G[x][i]];
                if(!vis[e.to]&&e.cap>e.flow){
                    vis[e.to]=1;
                    d[e.to]=d[x]+1;
                    q.push(e.to);
                }
            }
        }
        return vis[t];
    }
    int DFS(int x,int a){
        if(x==t||a==0) return a;
        int flow=0,f,len=G[x].size();
        for(int& i=cur[x];i<len;i++){
            Edge& e=edges[G[x][i]];
            if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){
                e.flow+=f;
                edges[G[x][i]^1].flow-=f;
                flow+=f;
                a-=f;
                if(a==0) break;
            }
        }
        return flow;
    }
    int maxflow(int s,int t,int limit){
        this->s=s;
        this->t=t;
        int flow=0;
        while(BFS()){
            memset(cur,0,sizeof(cur));
            flow+=DFS(s,limit-flow);
            if(flow==limit) break;
        }
        return flow;
    }
}g;

int ID(int u,int v){
    return u*N+v+1;
}
int ID(int u){
    return N*N+u+1;
}
bool win(int team){
    int total=w[team];
    for(int i=0;i<N;i++) total+=a[team][i];
    for(int i=0;i<N;i++) if(w[i]>total) return false;
    g.clear_all(N*N+N+2);
    int s=0,t=N*N+N+1,full=0;
    for(int u=0;u<N;u++){
        for(int v=u+1;v<N;v++){
            if(a[u][v]>0) g.add_edge(s,ID(u,v),a[u][v]);
            full+=a[u][v];
            g.add_edge(ID(u,v),ID(u),INF);
            g.add_edge(ID(u,v),ID(v),INF);
        }
        if(w[u]<total) g.add_edge(ID(u),t,total-w[u]);
    }
    return g.maxflow(s,t,full)==full;
}
int main(){
    freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        for(int i=0;i<N;i++) scanf("%d%d",&w[i],&d[i]);
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++) scanf("%d",&a[i][j]);
        int first=1;
        for(int i=0;i<N;i++) if(win(i)){
            if(first) first=0;
            else printf(" ");
            printf("%d",i+1);
        }
        puts("");
    }
    return 0;
}



DeerFlow 系列教程 第十八篇 | 实战案例三——用 DeerFlow 构建自定义 AI 工作流 在实际业务中,许多复杂的内容生产任务不是单一技能就能覆盖的。需要先调研某个主题的最新信息基于调研结果撰写结构化的文章或报告对报告中的数据进行可视化处理最终输出符合品牌风格的排版文档或演示文稿这些环节涉及不同的领域知识和工具链,单个内置技能无法完全覆盖。组合自定义技能、MCP 外部工具和多 Agent 协作,构建端到端的工作流。传统手工流程: DeerFlow 自定义工作流:搜索资料、阅读文献 用户描述需求│ │▼ ▼。 阅读详情

相关推荐

告别玄学调试:手把手教你读懂全志芯片的sys_config.fex配置文件(以i2c配置为例)

本文深入解析全志芯片的sys_config.fex配置文件,以I2C设备驱动为例,详细讲解从引脚定义到驱动加载的全过程。通过实战案例和高级调试技巧,帮助开发者快速掌握硬件配置与内核驱动的联动机制,提升开发效率。

weixin_33737134的博客 418

UVA 1306 - The K-League(网络流)

UVA 1306 - The K-League 题目链接 题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜 思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完

Remilia's 1467

ROS自定义地图实战:从CAD到导航的完整流程

本文详细介绍了如何将CAD图纸或手绘草图高效转换为ROS机器人可直接使用的导航地图。通过解析PGM与YAML标准格式,提供从图像处理、尺度校准到集成AMCL与move_base导航栈的完整实战流程,帮助开发者跳过繁琐的SLAM建图,实现快速、精准的自定义地图部署。

weixin_29083475的博客 496

uva 1306 The K-League (最大流)

uva 1306 The K-LeagueDescription Supporters for the professional soccer clubs participating in the K-League, formerly the Korea Professional Soccer League, hold orderly and organized cheering, as did

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 952

5分钟搞定kkFileView 4.4.0 Docker部署:小白也能上手的完整配置流程

本文提供了一份针对kkFileView 4.4.0版本的Docker部署完整指南。通过使用预构建的Docker镜像,即使是新手也能在5分钟内完成文件预览服务的搭建,涵盖从环境准备、镜像拉取、容器启动到服务验证的全流程,并分享了进阶配置与生产环境优化建议。

mango的博客 524

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1320

UVA1306 The K-League(最大流)

数据范围大大降低做题乐趣

DD(XYX)的硫氰化氘博客 211

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

【网络流专练一】UVA五题(UVA12125,UVA11082,UVA10983,UVA1306,UVA10735)

UVAnm坟头我都给你买好了

559

Cadence Virtuoso IC617:从零构建传输门与反相器的Schematic设计实战

本文详细介绍了使用Cadence Virtuoso IC617进行传输门与反相器Schematic设计的完整流程,包括环境准备、原理图绘制、Symbol创建、仿真验证及实用技巧。通过分步指导和实战经验分享,帮助初学者快速掌握集成电路设计基础,提升EDA工具应用能力。

weixin_29194693的博客 596

Ubuntu 20.04下Cube-Studio云原生平台单机部署全攻略(附避坑指南)

本文详细介绍了在Ubuntu 20.04系统上单机部署Cube-Studio云原生平台的完整流程,包括环境准备、Docker配置、Rancher与Kubernetes集群部署以及Cube-Studio核心组件安装。特别提供了官方文档未涵盖的实战技巧和常见问题解决方案,帮助开发者高效完成部署并避免常见陷阱。

weixin_29313423的博客 464

UVa 1306 The K-League

本文探讨了如何判断K联赛中某支球队是否可能夺冠的问题。通过计算目标球队的最大可能胜场数,并构建网络流模型来验证是否存在满足条件的比赛分配方案。关键步骤包括:1) 计算目标球队全胜时的胜场上限;2) 快速检查其他球队当前胜场是否已超过该上限;3) 将剩余比赛建模为网络流问题,使用Dinic算法求解最大流,若最大流等于总剩余比赛数则说明存在可行方案。该方法将实际问题转化为图论模型,有效解决了胜负分配的可行性判断问题。

寂静山林 1286

61、增益调度控制器:原理、建模与调优

本文详细介绍了增益调度控制器的原理、建模方法和调优流程。增益调度是一种针对非线性系统的控制策略,通过在不同工作点使用不同的线性控制器实现全局控制。文章涵盖了在Simulink中使用Control System Toolbox模块建模的具体步骤,以及如何利用systune进行增益调度表的调优。同时,还讨论了实际应用中的注意事项、典型案例(如化学反应器和飞机控制),并与其它控制方法进行了对比。最后,文章展望了增益调度控制器的未来发展趋势,包括与人工智能的结合、多目标优化调优以及实时调优能力的提升。

rgv234567的博客 186

Uva 1306 The K-League

网络流。枚举每个队夺冠。设win为夺冠赢得场数,那么显然别的队赢得次数都不能超过win。于是我们可以从源点s向每个队u(除了当前枚举的队)加边,容量为win-w[i],即该队还能赢多少场,然后再从从该队向节点(u,v)连边,容量为a[u][v]表示u和v比最多赢a[u][v]场,最后从节点(u, v) 向汇点t连边,容量为a[u][v],表示这个节点最多能产生a[u][v]场胜利。如果最大流等于所

ok_again的专栏 1070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

UVA 1306 LA 2531 The K-League

题意:有n只队伍打比赛 给出每只队目前获胜和失败的场数 再给出两两队伍接下来的比赛场次 问你哪些队伍可能的冠军 思路:主要考察建图方法 我们要依次判断每只队伍是否可能获胜 对于队伍i 首先预处理出i获胜的总场数sum 对每两只队伍进行编号(比如(u, v)编号为x) 从源点连一条到该编号的边 容量为这两只队伍接下来要比的场次 然后从该编号向这两只队伍连边 容量INF 最后 对于每只队伍 分别向汇

s_h_r 619

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

(转)Uva 1306 The K-League --- ISAP

网络流。枚举每个队夺冠。设win为夺冠赢得场数,那么显然别的队赢得次数都不能超过win。于是我们可以从源点s向每个队u(除了当前枚举的队)加边,容量为win-w[i],即该队还能赢多少场,然后再从从该队向节点(u,v)连边,容量为a[u][v]表示u和v比最多赢a[u][v]场,最后从节点(u, v) 向汇点t连边,容量为a[u][v],表示这个节点最多能产生a[u][v]场胜利。如果最大流等于所...

。 180

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UVA 1306 The K-League (最大流)

题意:有n支球队进行比赛,每只队伍需要打的比赛数目相同。每场比赛恰好一支队伍胜,另一支败。给出每支队伍目前胜的场数和败的场数,以及每两个队伍还剩下的比赛场数,确定所有可能的冠军的球队(获胜常数最多的的冠军,可以并列)。 思路:让i在所有队伍中取胜,设总共赢的场数为sum,那么剩下的队伍j最多只能赢sum - w[j],建立附加源点汇点,u,v之间有比赛的话,建立一个比赛节点,比赛节点连向

hnust_Derker的博客 504

Uva-1306-The K-League

题目是判断可能赢的队伍,是白书上的一个题,建图

z309241990的专栏 639

Dinic+当前弧优化

Dinic算法是不停用BFS构造层次图,然后

7141

Dijkstra 求最短路 最大流

原来Dijkstra算法不光只能求最短路问题,还能求最大流问题~~~求最短路 最大流" title="Dijkstra 求最短路 最大流"> 最短路问题时,Dijkstra算法的基本思想:   邻接矩阵w[x][y]保存x和y间的距离(别的设为INF,表示不连通,设为-1也行,后来更新加一个if(w[x][y]>=0)),数组d保存通过已经确定的点从起点到每个点的最短路。初始化d[0]=0,

1847

网络流 最大流 Edmonds-Karp算法

Edmonds-Karp算法,复杂度O(VE^2)。思想就是找增广路,不断增加流量。在残量(每条边上流量和容量的差)图上找一条每个边权值都为正的路(可以通过BFS,比DFS效率高),这些边权值里的最小值就是这条路可以增加的流量,然后在这条路径上更新流量。再重复找这样的路更新流量,直到找不到这样的路了就说明流量不能再增加了,当前的流就已经是最大流。   同时最大流也是最小割(权值和最小的割集)。设

1842

Bellman_Ford和Spfa两种方法判断负环

Bellman_Ford是通过N-1次循环求出每个点到原点的最短路的,每次循环遍历所有的边,如果能更新就更新。前面说过为什么N-1次就行(若一个点到起点的最短路需要经过N个点,包括他自己,那么第N次循环就能确定他的最短路)。   最短路一定是不含环的,如果存在负环就根本不存在最短路了。所以这个方法可以用来判断是否有负环,如果循环了N-1次后还能进行松弛操作,说明有负环。Bellman_Ford的

1712

hdu5294 Tricks Device 最短路+最小割 多校联合第一场

Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 66    Accepted Submission(s): 14 Problem Description Innocent Wu follows

1563

uva1416 - Warfare And Logistics 最短路树优化

The army of United Nations launched a new wave of air strikes on terroristforces. The objective of the mission is to reduce enemy's logistical mobility. Each airstrike will destroy a path and therefor

1002

uva1324 - Bring Them There 网络流

By the year 3141, the human civilization has spread all over the galaxy. The special hypertunnels are usedto travel from one star system to another. To use the hypertunnel, you fly to a special locati

816

uva10806 - Dijkstra, Dijkstra. 最小费用流 求两条路权值之和最小

最小费用流是每次在残量图中求出起点到终点的最短路,然后再找出最短路上权值最小的一个边作为增广流量进行增广,更新流量,加上费用(最短路*增广流量)。找最短路用的不带链接表的spfa算法。因为每次增广后都是新流量下的最小费用流,所以最后就是最大流的最小费用。   如果是无向图、有平行边和反向边就比较麻烦了。。在有向图,没有平行边和反向边的情况下,设cap[v][u]=0,cost[v][u]=-co

781
上一篇: uva1324 - Bring Them There 网络流
下一篇: uva11613 - Acme Corporation 费用流
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值