zzuli 2131: Can Win(最大流 公平分配)@
2017-04-26 19:52
274 查看
2131: Can Win
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 265 Solved: 27
SubmitStatusWeb
Board
Description
Zhc很喜欢看某个竞技比赛,比赛的规则是这样的:队伍分成AB两组进行比赛,除了组内比赛,两组之间还会进行一定的比赛,每场比赛赢者得1分,输者不得分,没有平局的情况。 在A组里面Zhc有一支自己非常喜欢的队伍,现在比赛已经进行到一半了,Zhc想知道,他支持的那支队伍有没有可能获得最终的胜利(A组最高分即为胜利,允许多支队伍同时最高分)Input
第一行输入样例组数T<=110每组样例第一行输入A组队伍数量n<=400,以及Zhc支持的队伍编号(1-n)K<=n
第二行按编号输入A组各队伍目前的成绩Mark[i]<= 300000
第三行按编号输入A组各队伍剩余比赛总场数Cnt[i]<= 300000
下面有一个N*N的矩阵,其中A[i][j]代表编号i的队伍跟编号j的队伍剩余比赛场数A[i][j]<=100
Output
对每组样例输出”Yes”或者”No”(不用输出引号)代表Zhc支持的队伍能获得最终的胜利,换行处理Sample Input
12 1
5 6
2 2
0 1
1 0
Sample Output
Yes#include <iostream> #include <bits/stdc++.h> using namespace std; const int N = 500; typedef long long LL; int m , c , w , a ; const int inf = 99999999; const int MAXN = 200010; struct Edge { int to, next, cap, flow; } edge[MAXN*10]; int tol; int head[MAXN]; int gap[MAXN], dep[MAXN], pre[MAXN], cur[MAXN]; void init() { tol = 0; memset(head, -1, sizeof(head)); } void add(int u, int v, int w, int rw = 0) { edge[tol].to = v;edge[tol].cap = w;edge[tol].next = head[u];edge[tol].flow = 0;head[u] = tol++; edge[tol].to = u;edge[tol].cap = rw;edge[tol].next = head[v];edge[tol].flow = 0;head[v] = tol++; } int sap(int start, int end, int N) { memset(gap, 0, sizeof(gap)); memset(dep, 0, sizeof(dep)); memcpy(cur, head, sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; int ans = 0; while(dep[start] < N) { if(u == end) { int Min = inf; for(int i = pre[u]; i != -1; i = pre[edge[i^1].to]) if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; for(int i = pre[u]; i != -1; i = pre[ edge[i ^ 1].to ]) { edge[i].flow += Min; edge[i^1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for(int i = cur[u]; i != -1; i = edge[i].next) { v = edge[i].to; if(edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u]) { flag = true; cur[u] = pre[v] = i; break; } } if(flag) { u = v; continue; } int Min = N; for(int i = head[u]; i != -1; i = edge[i].next) { if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } } gap[dep[u]]--; if(!gap[dep[u]]) return ans; dep[u] = Min+1; gap[dep[u]]++; if(u != start) u = edge[ pre[u] ^ 1 ].to; } return ans; } int check(int n,int tmp) { for(int i=1;i<=n;i++) { if(m[i]>tmp) return 1; } return 0; } int main() { int t; scanf("%d", &t); while(t--) { int n, s; scanf("%d %d", &n, &s); int maxt=INT_MIN; for(int i=1;i<=n;i++) { scanf("%d", &m[i]); maxt=max(maxt,m[i]); } for(int i=1;i<=n;i++) scanf("%d", &c[i]); int sum=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d", &w[i][j]); if(j>i) sum+=w[i][j]; } } int tmp=m[s]+c[s]; if(check(n,tmp)) { cout<<"No"<<endl; continue; } init(); int sx=0, ex=n+1, k=n+2; for(int i=1;i<=n;i++) { if(i==k) continue; add(i,ex,tmp-m[i]); for(int j=i+1;j<=n;j++) { if(j==k) continue; add(sx,k,w[i][j]); add(k,i,inf); add(k,j,inf); k++; } } int ans=sap(sx,ex,k); if(ans!=sum) printf("No\n"); else printf("Yes\n"); } return 0; }
相关文章推荐
- 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)
- POJ1336 The K-League[最大流 公平分配问题]
- UVALive 2531 The K-League(最大流、公平分配模型)
- [蓝书/Ch5] The K-League UVALive - 2531 最大流/公平分配问题
- uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。
- UVALive 3231 Fair Share 最大流(公平分配)
- Asteroids(二分图的最大分配)
- thread线程栈size及局部变量最大可分配size
- hdu3572 Task Schedule(基础) [最大流]任务分配,判断满流
- 图论算法(六)-- 二分图的最大分配问题(JAVA)
- POJ3281_Dining_最大流::分配问题
- 怪异问题 调试到位置(test dword ptr [eax],eax ; probe page.)局部数组变量定义所分配的最大空间为1M
- SSL 1338 最大匹配 人员分配
- SQL Server 2008 R2 CPU 和 内存 最大优化 分配
- Yarn2.2.0公平调度器分配流程
- HDU2063--二分图最大分配
- 1338 最大匹配 人员分配(模板题)
- 完美字符串 输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。如dad 77
- 关于栈、堆、静态存储区最大可分配大小的探讨
- 肯尼亚矿工描述加密货币是“迄今为止最大的财富分配系统”