NBA打比赛。所有的比赛被分为多个团队。有的比赛是团内的,有的是与团外的队伍打的。

给出团内每个队伍已得分,以及总共有多少场比赛,还有团内所有队伍之间有多少场比赛?

问1队是否可能是分数最高的一个队伍。(题目没说是否唯一最高,枚举题意得知不是唯一)

又是一个竞赛图的最大流。团内的比赛,如果有一个队伍是1队,那么安排结果1队胜利,另一队伍失败。

对于所有与外团的比赛,与1队有关的都胜利,否则失败。

接下来建图,我们做完前面的工作后,分别统计所有的队伍得分,1队分数减去x队的分数就是x队在所有的团内赛中最多能够胜利的场数。

模型就出来了,源点->队伍->比赛->汇点,最终我们只要判断所有比赛的出边是否满流,即所有的比赛能否安排得下即可。

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 5550
#define maxm 55550
using namespace std; int next[maxm],to[maxm],c[maxm],first[maxn],edge=-;
int score[maxn],test[maxn],tag[maxn],TAG=;
bool can[maxn];
int a[][],node=-,d[maxn];
int Q[maxn],bot,top;
int alltest=,ans,n,m,s,t; int addnode()
{
first[++node]=-;
return node;
} void addedge(int U,int V,int W)
{
edge++;
to[edge]=V,c[edge]=W,next[edge]=first[U],first[U]=edge;
edge++;
to[edge]=U,c[edge]=,next[edge]=first[V],first[V]=edge;
} bool bfs()
{
Q[bot=top=]=t,d[t]=,tag[t]=++TAG,can[t]=false;
while (bot<=top)
{
int cur=Q[bot++];
for (int i=first[cur]; i!=-; i=next[i])
if (c[i^]> && tag[to[i]]!=TAG)
{
tag[to[i]]=TAG,can[to[i]]=false;
d[to[i]]=d[cur]+,Q[++top]=to[i];
if (to[i]==s) return true;
}
}
return false;
} int dfs(int cur,int num)
{
if (cur==t) return num;
int tmp=num,k;
for (int i=first[cur]; i!=-; i=next[i])
if (c[i]> && tag[to[i]]==TAG && !can[to[i]] && d[to[i]]==d[cur]-)
{
k=dfs(to[i],min(num,c[i]));
if (k) num-=k,c[i]-=k,c[i^]+=k;
if (num==) break;
}
if (num) can[cur]=true;
return tmp-num;
} bool _input()
{
scanf("%d",&n);
s=addnode();
for (int i=; i<=n; i++) t=addnode();
t=addnode();
for (int i=; i<=n; i++) scanf("%d",&score[i]);
for (int i=; i<=n; i++) scanf("%d",&test[i]);
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
{
scanf("%d",&a[i][j]);
if (!a[i][j] || i>=j) continue;
test[i]-=a[i][j],test[j]-=a[i][j];
if (i==) score[]+=a[i][j];
else
{
alltest+=a[i][j];
int tmp=addnode();
addedge(i,tmp,a[i][j]);
addedge(j,tmp,a[i][j]);
addedge(tmp,t,a[i][j]);
}
}
score[]+=test[];
for (int i=; i<=n; i++)
{
if (score[i]>score[]) return false;
addedge(s,i,score[]-score[i]);
}
int ans=;
while (bfs()) ans+=dfs(s,maxn);
return ans==alltest;
} int main()
{
if (_input()) puts("YES");
else puts("NO");
return ;
}

SGU326_Perspective的更多相关文章

随机推荐

  1. NGUI可展开列表的实现

    本文来自网易云社区 作者:汪毅军 最近使用了NGUI做了下可展开列表,其主要思路如下:首先最外层使用Scroll view以达到滑动效果,然后列表使用UITable进行排列,最后通过点击Item控制I ...

  2. Docker与CI持续集成/CD(转)

    背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会 ...

  3. 设置pdsh的默认登录模式

    1.check your pdsh default rcmd rsh pdsh -q -w localhostSee what your pdsh default rcmd is. 2.Modify ...

  4. 【赛后补题】Lucky Probability(CodeForces 110D)

    题意 给定两个\(P,Q\)的正整数区间(\(P,Q\)都符合\([L,R]\)这个区间,并且都\(\le 10^9\)),分别从其中随机选出一个数,选出的两个数作为一个新区间的左右端点.要求新区间内 ...

  5. 接口测试中抓包工具Charles的使用

    在被测接口并没有明确的接口文档给出时,我们需要借助抓包工具来帮助测试,利用抓包工具我们几乎可以获得接口文档中能给你的一切.常见的抓包工具有Charles和Fiddler, Fiddler只能用在Win ...

  6. [Lua] try catch实现

    参考了https://blog.csdn.net/waruqi/article/details/53649634这里的代码,但实际使用时还有些问题,修改后在此记录一下. -- 异常捕获 functio ...

  7. linux文件种类及其扩展名

    文件种类 普通文件(ls -al出来第一列为-) 纯文本文件(ASCII):linux系统中最多的一种文件类型,可以使用cat直接读取: 二进制文件(binary):linux下面的可执行文件: 数据 ...

  8. python-python爬取豆果网(菜谱信息)

    #-*- coding = utf-8 -*- #获取豆果网图片 import io from bs4 import BeautifulSoup import requests #爬取菜谱的地址 ur ...

  9. python中__name__属性的使用

    python常用模块目录 1.打印出函数名字而非函数名对应的地址 )打印的是函数地址 def func(): print("我是%s函数"%func) func() ------- ...

  10. Node.js开发入门—套接字(socket)编程

    Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议.这次我们看一个简单的回显服务器示例,包括服务端和客户端的代码. 代码 分服务器和客户端两部分来说吧 ...