YES" (without quotes) if it's possible for the team 1 to score at least as much wins as any other team of its division, and "
NO" (without quotes) otherwise.
sample input |
sample output |
3 1 2 2 1 1 1 0 0 0 0 0 0 0 0 0 |
YES |
sample input |
sample output |
3 1 2 2 1 1 1 0 0 0 0 0 1 0 1 0 |
NO |
英语太渣,竟然看不懂题意...
题意:有两个赛区,每个赛区有n支队伍,输入本赛区n个队伍目前已获胜的比赛场数score[i]和还要进行的比赛场数num[i](包括和本赛区的其他队伍的比赛以及和另一个赛区n个队伍的比赛),接下来是一个本赛的比赛矩阵,Aij表示本赛区i队和j队还需要进行Aij场比赛,问是否存在一种方案1队为本赛区第一(可与本赛区其他队并列第一)。
此题与woj1124极其相似,传送门:woj1124
首先是贪心,一队赢得所有剩余比赛。
num[i]-sigma{j=[1...n]}(aij)就是i队与另一个赛区的比赛场数了,i队显然输掉这些比赛。
剩下来就是本赛区i队和j队的比赛(i,j均不为1),这里建模完全和woj1124类似,不再赘述。注意:Aij可以大于1.
代码:
#include<cstdio> #include<iostream> #include<cstring> #define Maxn 430 using namespace std; int score[Maxn],num[Maxn],mat[Maxn][Maxn]; const int inf=0x3f3f3f3f; struct line{ int to,next,cap; }p[Maxn*Maxn]; int head[Maxn]; int q[Maxn]; int d[Maxn]; int tot; int src,t; int n,m; void addedge(int a,int b,int c){ p[tot].to=b; p[tot].next=head[a]; p[tot].cap=c; head[a]=tot++; } void insert(int a,int b,int c){ addedge(a,b,c); addedge(b,a,0); } bool bfs(){ memset(d,-1,sizeof d); int s=0,e=-1; q[++e]=src; d[src]=0; while(s<=e){ int u=q[s++]; for(int i=head[u];i!=-1;i=p[i].next){ int v=p[i].to; if(d[v]==-1&&p[i].cap){ d[v]=d[u]+1; q[++e]=v; } } } return d[t]!=-1; } int dfs(int u,int alpha){ if(u==t) return alpha; int w,used=0; for(int i=head[u];i!=-1&&used<alpha;i=p[i].next){ int v=p[i].to; if(p[i].cap&&d[v]==d[u]+1){ w=dfs(v,min(alpha-used,p[i].cap)); used+=w; p[i].cap-=w; p[i^1].cap+=w; } } if(!used) d[u]=-1; return used; } int dinic(){ int ans=0; src=0; while(bfs()) ans+=dfs(src,inf); return ans; } int main() { while(cin>>n){ for(int i=1;i<=n;i++) scanf("%d",score+i); for(int i=1;i<=n;i++) scanf("%d",num+i); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&mat[i][j]); score[1]+=num[1]; bool flag=true; for(int i=2;i<=n;i++) if(score[i]>score[1]) {flag=false;break;} if(!flag) {puts("NO");continue;} t=n+1; int res=0; tot=0; memset(head,-1,sizeof head); for(int i=2;i<=n;i++) for(int j=i+1;j<=n;j++) if(mat[i][j]>0){ res+=mat[i][j]; insert(0,t,mat[i][j]); insert(t,i,mat[i][j]); insert(t,j,mat[i][j]); t++; } for(int i=2;i<=n;i++) insert(i,t,score[1]-score[i]); if(res==dinic()) puts("YES"); else puts("NO"); } return 0; }