#最大流#WOJ 124 Football Coach

题目

\(n\)支球队,互相之间已经进行了一些比赛。现在还有\(m\)场比赛未进行,
每场比赛胜者得2分,平局各得1分,负者不得分。
问是否存在一种方法使得球队\(n\)的得分比其他\(n-1\)支球队的得分都高。
\(n\leq 100,m\leq 1000\)


分析

要让\(n\)比其他人都大那么肯定所有和\(n\)有关的比赛都是\(n\)赢。
我们对每场比赛建一个点\(u\),从\(S\)\(u\)连容量为2的边。
对每支队伍建一个点\(v\),从\(v\)\(T\)连容量为\(a[n]-a[v]-1\)的边。
然后从每个比赛点\(u\)向那两支队伍连容量为2的边。
跑一遍最大流就可以出解,有解当且仅当满流。
如果没有平分的可能直接让所有容量除以2向下取整就可以了。


代码

for (rr int i=1;i<=n;++i) scanf("%d",&a[i]);

for (rr int i=1;i<=m;++i){

    scanf("%d%d",&x,&y);

    if (x==n||y==n) a[n]+=2;

    else add(S,i,2),add(i,x+n,2),add(i,y+n,2),++ans;

}

for (rr int i=1;i<n;++i) if (a[i]>=a[n]) return !puts("NO");

for (rr int i=1;i<n;++i) add(i+m,T,a[n]-a[i]-1);

return !puts((dinic()==ans*2)?"YES":"NO"); 

posted @ 2020-12-30 14:51  lemondinosaur  阅读(61)  评论(0编辑  收藏  举报