题意:

有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. python模块--os模块、sys模块

    一.os模块 1 os.getcwd() 获取当前工作的目录,即当前python脚本工作的目录路径 2 3 os.chdir("dirname") 改变当前脚本的工作目录:相当于s ...

  2. JDBC的概念、实现原理与连接数据库的几种方法

    1.首先要知道jdbc(概念): 使用Java代码发送sql语句的技术就是jdbc技术(jdbc英文全称:Java DataBase Connectivity,java数据库连接).即jdbc是一个接 ...

  3. 安装系统出现Winload.exe错误0xc000000e解决方法

    有的用户在安装Win7/Win8/Win10操作系统后,重启时出现Windows 启动管理器错误,无法加载所选项,因为应用程序丢失或损坏的的故障,错误代码:0xc000000e,这是由于引导文件没有正 ...

  4. 8.Python编写登录接口

    1.python需安装flask,在命令行窗口输入:pip3 install flask 2.代码如下所示: from flask import Flask,request,jsonify,sessi ...

  5. 关于vim搜索/替换功能的两条配置

    之前是直接照着这篇的配置的强大的vim配置文件 自己也只是对vim新建文件修改文件的哪个函数SetTitle()做了点修改,毕竟用vim只写C/C++和python.shell. 没想到今天在用vim ...

  6. Jquery学习小计

    实时监听输入框值变化 首先创建Jquery.fn扩展 jQuery.fn.extend({ inputChange: function(callback){ if($.support.leadingW ...

  7. Java并发-Runnable、Callable、Future、Future Task

    Runnable: Runnable的代码非常简单,他是一个接口,且接口中只有一个方法,run(),创建一个类实现他,把一些费时操作写在其中,然后使用某个线程去执行该Runnable实现类即可实现多线 ...

  8. CRUD

    identity 自增长 primary key 主键 unique 唯一键 not null 非空 references 外键(引用) 1.删除表 drop table Student 2.修改表 ...

  9. SpringMVC之五:自定义DispatcherServlet配置及配置额外的 servlets 和 filters

    相关文章 <Servlet3.0之四:动态注册和Servlet容器初始化> <SpringBoot中通过SpringBootServletInitializer如何实现组件加载> ...

  10. MySQL 5.7.18 主从复制 Error1205

    从库报 error 1205 1.mysql报错信息 [root@slave2(35.102) ~]# mysql -uroot -p Enter password: Welcome to the M ...