[蓝书/Ch5] The K-League UVALive
来源:互联网 发布:数控车g76编程实例 编辑:程序博客网 时间:2024/05/16 06:57
题目链接
首先算出i在剩下比赛中全部获胜,看剩下的是否互相牵制,这样就转化成了公平分配问题的模型.
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1000 + 10;const int INF = 1000000000;struct Edge { int from, to, cap, flow;};bool operator < (const Edge& a, const Edge& b) { return a.from < b.from || (a.from == b.from && a.to < b.to);}struct Dinic { int n, m, s, t; vector<Edge> edges; // 边数的两倍 vector<int> G[maxn]; // 邻接表,G[i][j]表示结点i的第j条边在e数组中的序号 bool vis[maxn]; // BFS使用 int d[maxn]; // 从起点到i的距离 int cur[maxn]; // 当前弧指针 void ClearAll(int n) { for(int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void ClearFlow() { for(int i = 0; i < edges.size(); i++) edges[i].flow = 0; } void AddEdge(int from, int to, int cap) { edges.push_back((Edge){from, to, cap, 0}); edges.push_back((Edge){to, from, 0, 0}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; while(!Q.empty()) { int x = Q.front(); Q.pop(); for(int i = 0; i < G[x].size(); i++) { Edge& e = edges[G[x][i]]; if(!vis[e.to] && e.cap > e.flow) { vis[e.to] = 1; d[e.to] = d[x] + 1; Q.push(e.to); } } } return vis[t]; } int DFS(int x, int a) { if(x == t || a == 0) return a; int flow = 0, f; for(int& i = cur[x]; i < G[x].size(); i++) { Edge& e = edges[G[x][i]]; if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap-e.flow))) > 0) { e.flow += f; edges[G[x][i]^1].flow -= f; flow += f; a -= f; if(a == 0) break; } } return flow; } int Maxflow(int s, int t) { this->s = s; this->t = t; int flow = 0; while(BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, INF); } return flow; } vector<int> Mincut() { // call this after maxflow vector<int> ans; for(int i = 0; i < edges.size(); i++) { Edge& e = edges[i]; if(vis[e.from] && !vis[e.to] && e.cap > 0) ans.push_back(i); } return ans; } void Reduce() { for(int i = 0; i < edges.size(); i++) edges[i].cap -= edges[i].flow; }};Dinic g;int n;int T;int w[100];int d[100];int a[100][100];inline int getnum(int x,int y){ return n+(x-1)*n+y;}vector<int> ans;int main(){// freopen("data.txt","r",stdin); ios_base::sync_with_stdio(false); cin >> T; while(T--) { ans.clear(); cin >> n; for(int i=1;i<=n;i++) { cin >> w[i]>>d[i]; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin >> a[i][j]; } } int s = 0; int t = n*n+n+1; for(int i=1;i<=n;i++) { int total = w[i]; for(int j=1;j<=n;j++) { total += a[i][j]; } g.ClearAll(t+5); int sum = 0; for(int j=1;j<=n;j++) { for(int jj=1;jj<j;jj++) { if(j==i||jj==i) continue; int num = getnum(j,jj); sum += a[j][jj]; g.AddEdge(s,num,a[j][jj]); g.AddEdge(num,j,INF); g.AddEdge(num,jj,INF); } }// cout <<total<<"&&"<<endl; int f= 0; for(int j=1;j<=n;j++) { if(w[j]>total) { f = 1; break; } if(j==i) continue; g.AddEdge(j,t,total-w[j]); } if(f) { continue; } if(g.Maxflow(s,t)==sum) { ans.push_back(i); } } for(int i=0;i<ans.size();i++) { cout << ans[i]; if(i!=ans.size()-1) cout <<" "; } cout << endl; } return 0;}
阅读全文
0 0
- [蓝书/Ch5] The K-League UVALive
- [蓝书/Ch5] Astronauts UVALive
- UVALive 2531 The K-League 最大流
- UVALive 2531 The K-League 网络流+建图
- UVALive - 2531 The K-League(最大流+枚举)
- UVALive 2531 The K-League(最大流、公平分配模型)
- LA 2531 The K-League
- Uva 1306 The K-League
- Uva-1306-The K-League
- [蓝书/Ch5] Collectors Problem UVA
- uva1306 - The K-League 网络流
- The K-League (网络流,建图难)
- UVA 1306 LA 2531 The K-League
- LA 2531 The K-league 最大流
- UVAlive2531 The K-League(最大流)
- POJ 1336 The K-League 笔记
- UVA 1306 - The K-League(网络流)
- uva 1306 The K-League (最大流)
- Openjudge 06:月度开销
- 一个斐波那契数列的前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89,对于一个最大项的值不超过n的斐波那契数列,求值为偶数的项的和。
- Codeforce Round #438 C.Bus(贪心)
- Mathematical Morphology —— Path Operator
- java入门第三季--图书馆借书系统
- [蓝书/Ch5] The K-League UVALive
- 打印机管理网站(Java Web+Bootstrap)
- HDU2767 Proving Equivalences 解题报告【tarjan缩点】
- 几种保持登录状态的方式
- Linux中安装配置arm-2009q3方法
- 【NOJ】[1000] A+B Problem
- 安卓Context介绍
- Myeclipse优化building时间
- ubuntu-利用pdnsd-TCP方式获取IP-拒绝DNS污染