题意:

有n支队伍进行比赛,每支队伍需要打的比赛数目相同。每场比赛恰好一支队伍胜,另一支败。给出每支队伍目前胜的场数和败的场数,以及每两支队伍还剩下的比赛场数,确定所有可能的冠军的球队。(获胜场数最多的是冠军,可以并列)。

分析

一只队伍如果可能得冠军,那么就一定可以通过调整,未来的几场比赛的结果使自己赢得场次最多。否则便不可能成为冠军。

在判断第i支队伍有无可能成为冠军时:首先,第i支队伍得对局i全部取得胜利,得到i胜利的总场数为total。然后判断其他队伍的对局,能否互相限制使得,任何队伍胜利的场数都不超过total。

建模方法:

对每两支队伍(u,v)构造一个X结点,从S引一条弧过来,容量为这两支队伍还需要比赛的场数。对每支队伍u构造一个Y结点,引一条弧到T,容量为total-win[u].然后每个(u,v)结点向u和v结点个连一条无穷大得弧。这样当且仅当,从S出发得每条弧都是满载得时候,当前队伍才有可能得冠军。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector> using namespace std;
const int maxn=+;
const int MAXN=;
const int maxm=+;
const int INF=;
struct Dinic{
int head[maxn],Next[maxm],to[maxm],cap[maxm],flow[maxm],from[maxm];
int sz,n,m,s,t;
bool vis[maxn];
int cur[maxn],d[maxn];
void init(int n){
this->n=n;
memset(head,-,sizeof(head));
this->sz=-;
}
void add_edge(int a,int b,int c){
++sz;
to[sz]=b;
cap[sz]=c;flow[sz]=;from[sz]=a;
Next[sz]=head[a];head[a]=sz;
++sz;
to[sz]=a;
cap[sz]=c;flow[sz]=c;from[sz]=b;
Next[sz]=head[b];head[b]=sz;
}
bool BFS(){
memset(vis,,sizeof(vis));
queue<int>Q;
vis[s]=;
d[s]=;
Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=head[u];i!=-;i=Next[i]){
int v=to[i];
if(!vis[v]&&cap[i]>flow[i]){
vis[v]=;
d[v]=d[u]+;
Q.push(v);
}
}
}
return vis[t];
}
int DFS(int x,int a){
if(x==t||a==)return a;
int Flow=,f;
for(int& i=cur[x];i!=-;i=Next[i]){
int v=to[i];
if(d[v]==d[x]+&&(f=DFS(v,min(a,cap[i]-flow[i])))>){
Flow+=f;
flow[i]+=f;
flow[i^]-=f;
a-=f;
if(a==)break;
}
}
return Flow;
}
int Maxflow(int s,int t){
this->s=s,this->t=t;
int Flow=;
while(BFS()){
for(int i=;i<=n;i++)
cur[i]=head[i];
Flow+=DFS(s,INF);
}
return Flow;
}
}dinic;
int T,n;
int win[MAXN],lose[MAXN];
int G[MAXN][MAXN];
vector<int>ans;
bool judge(int num){
int total=win[num];
for(int i=;i<=n;i++){
total+=G[num][i];
}
//cout<<total<<endl; int allS=(n*n-*n+)/;
int NUM=;
dinic.init(allS+n+);
dinic.s=,dinic.t=allS+n+;
for(int i=;i<=n;i++){
if(i==num)continue;
for(int j=i+;j<=n;j++){
// cout<<i<<" "<<j<<" "<<G[i][j]<<endl;
if(j==num)continue;
NUM++;
dinic.add_edge(,NUM,G[i][j]);
dinic.add_edge(NUM,allS+i,INF);
dinic.add_edge(NUM,allS+j,INF);
}
} for(int i=;i<=n;i++){
if(i==num)continue;
if(total<win[i])return false;
dinic.add_edge(allS+i,dinic.t,total-win[i]);
}
dinic.Maxflow(,allS+n+);
for(int i=;i<=dinic.sz;i+=){
if(dinic.from[i]==){
if(dinic.flow[i]<dinic.cap[i])
return false;
}
}
return true;
}
int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
// if(t!=1)printf("\n");
ans.clear();
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&win[i],&lose[i]);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
scanf("%d",&G[i][j]);
}
}
/* if(judge(1))
printf("Yes 1");*/ for(int i=;i<=n;i++){
if(judge(i))
ans.push_back(i);
}
sort(ans.begin(),ans.end());
for(int i=;i<ans.size();i++){
if(i!=)printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
return ;
}

【LA2531 训练指南】足球联赛 【最大流】的更多相关文章

  1. 嘴巴题1 LA2531 足球联赛

    LA2531 足球联赛 题目: 有n只队伍打比赛,给出每只队目前获胜和失败的场数,再给出两两队伍接下来的比赛场次,问你哪些队伍可能的冠军 (题面摘自http://blog.csdn.net/s_h_r ...

  2. 使用 Python 抓取欧洲足球联赛数据

    Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤    数据的采集和获取    数据的清洗,抽取,变形和装载    数据的分析,探索和预测    ...

  3. [GRYZ2015]足球联赛

    问题描述 巴蜀中学新一季的足球联赛开幕了.足球联赛有n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3 分,输一场不得分,平局两只队伍各得一分.英勇无畏的小鸿是机房的主力前锋 ...

  4. poj 1961 Period(KMP训练指南例题)

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 11356   Accepted: 5279 Descripti ...

  5. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  6. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  7. 【UVA11107 训练指南】Life Forms【后缀数组】

    题意 输入n(n<=100)个字符串,每个字符串长度<=1000,你的任务是找出一个最长的字符串使得超过一半的字符串都包含这个字符串. 分析 训练指南上后缀数组的一道例题,据说很经典(估计 ...

  8. 【LA3523 训练指南】圆桌骑士 【双连通分量】

    题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...

  9. 训练指南 UVALive - 3126(DAG最小路径覆盖)

    layout: post title: 训练指南 UVALive - 3126(DAG最小路径覆盖) author: "luowentaoaa" catalog: true mat ...

随机推荐

  1. Cocos2d-x学习笔记1

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u014734779/article/details/26077453 1.创建新的cocos2d-x ...

  2. FastAdmin 中 Bootstrap-Table 列宽控制

    FastAdmin 中 Bootstrap-Table 列宽控制 使用 css 控制 1 使用 formatter 处理 2 http://issues.wenzhixin.net.cn/bootst ...

  3. python3api-ms-win-crt-runtime-l1-1-0.dll丢失解决方法

    先记录一个之前遇到的问题: 在安装了pycharm后,发现 通过上网发现,其实就是没有安装pip和setuptools,其实 Python3以后都是默认安装pip的,所以最后的解决办法是将我目前的Py ...

  4. (转)Inno Setup入门(六)——在程序目录下创建文件夹

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250789 创建文件夹可以使用[dirs]段实现,代码如下: [s ...

  5. Go - 切片(Slice)

    定义 切片本身不是数组,它指向底层的数组或者数组的一部分.因此,可以使用Slice来处理变长数组的应用场景. Silice 是一种引用类型. 1.定义一个空的Slice package main im ...

  6. 第一章 先把Kubernetes跑起来

    1.1 先跑起来 k8s官网已经为大家准备好了一个现成的最小可用系统.  https://kubernetes.io/docs/tutorials/kubernetes-basics/ 1.2 创建K ...

  7. 用CSS绘制最常见的40种形状和图形

    今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...

  8. Julia - 分数

    在 Julia 中,使用“//”运算符构造分数 julia> 1 // 2 1//2 julia> - 1 // 2 -1//2 分数会自动进行约分 julia> 2 // 4 1/ ...

  9. VMware Workstation 12 Pro(安装CentOS7)

    之前安装了一版 Ubuntu 14.04版本,发现蛮不好用的,果断放弃,换上CentOS7版本(在远程服务器上的安装方式除了网络设置有差异,基本相同) VMware Workstation 12 Pr ...

  10. IntelliJ Idea使用scalatest

    背景:作为测试,开发写什么,测试自然就要测什么了,so = = 无scala基础,人较笨,折腾了两天才把环境弄好,如下: 一 IntelliJ Idea下载安装 这个真心是最简单的了 https:// ...