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. 菜鸟vimer成长记——第2.1章、normal模式

    目的 掌握normal模式下常用操作的语法和概念,这些操作对应的应用场景以及实用技巧. 通过normal模式举一反三掌握cmd-line和visual的常用文本操作. 简介 文本操作的理想状态为:一个 ...

  2. UWP 剪贴板 Clipboard

    Clipboard使用Windows.ApplicationModel.DataTransfer.Clipboard 设置文本 DataPackage dataPackage = new DataPa ...

  3. Direct2D处理几何图形之间的碰撞检测(下)

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 上一篇文章中我们介绍了几何图形与点的碰撞检测.几何图形与点的位置关系比较简单:点在几何图形内.点在几何图形外.点 ...

  4. Python学习之路:NumPy初识

    import numpy as np; //一维NumPy数组 myArray = np.array([1,2,3,4]); print(myArray); [1 2 3 4] //打印一维数组的形状 ...

  5. react-native初体验(2) — 认识路由

    如果学习止步于 hello world, 那么人生也太没意思了.这次要做一个看起来真实的应用.多添加几个页面,让他们可以交互,动起来. react-native 官方推荐使用 react-naviga ...

  6. 《spark机器学习 第二版》 蔡立宇 分享 pdf下载

    链接:https://pan.baidu.com/s/15Y14eAnfj8zf5mXdixbVeQ 提取码:rkdt

  7. django1.11入门

    快速安装指南¶ 在使用Django之前,您需要安装它.我们有 完整的安装指南,涵盖所有可能性; 本指南将指导您进行简单,最小化的安装,在您完成介绍时可以正常工作. 安装Python¶ 作为一个Pyth ...

  8. Streamr助你掌控自己的数据(2)——三种整合数据至Streamr的典型场景

    博客说明 所有刊发内容均可转载但是需要注明出处. 三种整合数据至Streamr的典型场景 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数 ...

  9. xlrd模块学习

    python常用模块目录 )# 打开Excel文件读取数据 import xlrd workbook = xlrd.open_workbook('mcw_test.xlsx') print(workb ...

  10. 20135316王剑桥 linux第四周课实验笔记

    第三章 程序的机器级表示 3.1历史观点 Intel处理器的换代:8086——80286——i386——i486——Pentium——PentiumPro——PentiumII——PentiumIII ...