题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33451

【思路】

最大流。

大体思路是枚举每个队伍,最大流判断是否可能成为冠军。

构图:

1 建立ST,比赛(u,v)建立n^2个结点,队伍u建立n个结点。

2 由S向(u,v)连容量为a[u][v]的边,由(u,v)向u和v连容量为INF的边,由u向T连容量为total-w[u]的边。

3 如果从S发出的边都满载则该team可行。

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<vector>
  5. #define FOR(a,b,c) for(int a=(b);a<(c);a++)
  6. using namespace std;
  7.  
  8. const int maxn = +;
  9. const int INF = 1e9;
  10.  
  11. struct Edge{
  12. int u,v,cap,flow;
  13. };
  14. struct Dinic {
  15. int n,m,s,t;
  16. bool vis[maxn];
  17. int d[maxn],cur[maxn];
  18. vector<int> G[maxn];
  19. vector<Edge> es;
  20.  
  21. void init(int n) {
  22. this->n=n;
  23. es.clear();
  24. for(int i=;i<n;i++) G[i].clear();
  25. }
  26. void AddEdge(int u,int v,int cap) {
  27. es.push_back((Edge){u,v,cap,});
  28. es.push_back((Edge){v,u,,});
  29. m=es.size();
  30. G[u].push_back(m-);
  31. G[v].push_back(m-);
  32. }
  33.  
  34. bool BFS() {
  35. queue<int> q;
  36. memset(vis,,sizeof(vis));
  37. q.push(s); vis[s]=; d[s]=;
  38. while(!q.empty()) {
  39. int u=q.front(); q.pop();
  40. for(int i=;i<G[u].size();i++) {
  41. Edge& e=es[G[u][i]];
  42. int v=e.v;
  43. if(!vis[v] && e.cap>e.flow) {
  44. vis[v]=;
  45. d[v]=d[u]+;
  46. q.push(v);
  47. }
  48. }
  49. }
  50. return vis[t];
  51. }
  52. int DFS(int u,int a) {
  53. if(u==t || a==) return a;
  54. int flow=,f;
  55. for(int& i=cur[u];i<G[u].size();i++){
  56. Edge& e=es[G[u][i]];
  57. int v=e.v;
  58. if( d[v]==d[u]+ && (f=DFS(v,min(a,e.cap-e.flow)))> ) {
  59. e.flow+=f;
  60. es[G[u][i]^].flow-=f;
  61. flow+=f,a-=f;
  62. if(!a) break;
  63. }
  64. }
  65. return flow;
  66. }
  67. int Maxflow(int s,int t) {
  68. this->s=s , this->t=t;
  69. int flow=;
  70. while(BFS()) {
  71. memset(cur,,sizeof(cur));
  72. flow+=DFS(s,INF);
  73. }
  74. return flow;
  75. }
  76. } dc;
  77.  
  78. int n;
  79. int w[maxn],d[maxn],a[maxn][maxn];
  80.  
  81. int main() {
  82. int T;
  83. scanf("%d",&T);
  84. while(T--) {
  85. scanf("%d",&n);
  86. for(int i=;i<n;i++) scanf("%d%d",&w[i],&d[i]);
  87. int sum=;
  88. for(int i=;i<n;i++)
  89. for(int j=;j<n;j++) scanf("%d",&a[i][j]) , sum+=a[i][j];
  90. sum/=;
  91. int S=n*n+n , T=S+;
  92. bool first=;
  93. for(int team=;team<n;team++)
  94. {
  95. int total=w[team];
  96. for(int i=;i<n;i++) total+=a[team][i];
  97. bool flag=;
  98. for(int i=;i<n;i++) if(w[i]>total) flag=; //即使全胜依然不可能是冠军
  99. if(flag) continue;
  100. dc.init(n*n+n+);
  101. for(int i=;i<n;i++) {
  102. for(int j=i+;j<n;j++) {
  103. int r=i*n+j;
  104. if(a[i][j]) dc.AddEdge(S,r,a[i][j]);
  105. dc.AddEdge(r,n*n+i,INF) , dc.AddEdge(r,n*n+j,INF);
  106. }
  107. dc.AddEdge(n*n+i,T,total-w[i]);
  108. }
  109. if(dc.Maxflow(S,T)==sum) {
  110. if(first) first=; else putchar(' ');
  111. printf("%d",team+);
  112. }
  113. }
  114. putchar('\n');
  115. }
  116. return ;
  117. }

UVAlive2531 The K-League(最大流)的更多相关文章

  1. POJ - 2516 Minimum Cost 每次要跑K次费用流

    传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...

  2. poj-2516.minimum cost(k次费用流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19883   Accepted: 7055 Des ...

  3. UVALive-2531 The K-League (最大流建模+枚举)

    题目大意:有n支足球队,已知每支球队的已胜场数和任意两支球队之间还需要的比赛场数a[i][j],求最终可能夺冠的所有球队. 题目分析:枚举所有的球队,对于球队 i 让它在接下来的比赛中全部获胜,如果这 ...

  4. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

  5. 【wikioi】1034 家园(最大流+特殊的技巧)

    http://wikioi.com/problem/1034/ 太神了这题. 其实一开始我以为是费用流,但是总感觉不对. 原因是我没看到一句话,特定的时刻到达特定的点!! 也就是说,并不是每艘船每次都 ...

  6. BZOJ 2324 营救皮卡丘(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2324 题意:n+1个城市(0到n).初始时K个 人都在0城市.城市之间有距离.要求(1) ...

  7. hdu3081 Marriage Match II(二分+并查集+最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意: n个女生与n个男生配对,每个女生只能配对某些男生,有些女生相互是朋友,每个女生也可以跟她 ...

  8. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  9. 【费用流】【CODEVS】1227 方格取数2

    [算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...

随机推荐

  1. maven占位符

    maven占位符默认是${} 也可以自己指定. pom.xml配置如下: <plugin> <groupId>org.apache.maven.plugins</grou ...

  2. 判断浏览器是否支持FileReader

    1.js代码: //判断浏览器是否支持FileReader if (typeof FileReader == "undefined") { document.write(" ...

  3. PSD 转化成 HTML

    一般情况下,网页设计制作完成的工作实际是:psd 效果图 转成 html+CSS 的模板页面,一般情况下,我们会拿到美工的 psd,不同的人会有不同的做法: 打开fireworks将图片切割导出为ht ...

  4. 24种设计模式--多例模式【Multition Pattern】

    这种情况有没有?有!大点声,有没有?有,是,确实有,就出现在明朝,那三国期间的算不算,不算,各自称帝,各有各的地盘,国号不同.大家还 记得那首诗<石灰吟>吗?作者是谁?于谦,他是被谁杀死的 ...

  5. in_array 判断问题的疑惑解决。

    面试题中有一条是关于in_array判断的,题目如下: 如何大家没有深入了解in_array的类型判断过程,而是根据经验来选择,肯定很多人也是是选择了D答案的,具体的原因我也是从牛人的博客里面得到答案 ...

  6. Android 学习手札(一) 应用程序架构

    1.资源列表 Android支持的资源列表 目   录 资源类型 描述 res/anim  XML  该目录用于存放帧(frame).动画或补间(tweened)动画文件 res/drawable   ...

  7. Oracle数据库之PL/SQL包

    Oracle数据库之PL/SQL包 1. 简介 包(PACKAGE)是一种数据对象,它是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来 ...

  8. 使用Thinkphp框架开发移动端接口

     本文给大家分享的是使用thinkphp框架开发移动端接口的2种方法,一种是开发API,另外一种是实现移动端访问自动切换移动主题模板,从而实现伪app访问,下面我们就来详细看下如何实现吧. 方案一:给 ...

  9. App Store生存指南

    资格获取   如果已经有App Store开发帐号请跳过此节.   App Store的资格获取其实一直以来都不算难,和其它事情一样,需要的只是耐心.现在苹果对申请者的文书手续要求已经比几年前简化多了 ...

  10. C#,Java,C++中的finally关键字

    博客原文:http://hankjin.blog.163.com/blog/static/33731937201031511305338/ 先说C++,标准C++不支持finally, 如果要实现fi ...