UVA10480 打印最大流割掉了哪条边..
来源:互联网 发布:帝王三国辅助软件 编辑:程序博客网 时间:2024/04/28 01:34
记录一下新的板子
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<queue> #include<map> #include<set> #include<string> #include<bitset> #include<algorithm> using namespace std;#define inf 99999999 #define maxn 400 //最大点的个数 #define maxm 400005 //最大边的个数 #define INF 1<<30 int gra[60][60];struct Edge{ int to, next, cap, flow, from; Edge() {} Edge(int from, int to, int next, int cap, int flow) :from(from), to(to), next(next), cap(cap), flow(flow) {}}edge[maxm];int vs, vt, VN;int tot;int first[maxn];int gap[maxn], dep[maxn], cur[maxn];void init(){ tot = 0; memset(first, -1, sizeof(first));}void addedge(int u, int v, int w){ edge[tot] = Edge(u, v, first[u], w, 0); first[u] = tot++; edge[tot] = Edge(v, u, first[v], 0, 0); first[v] = tot++;}int q[maxn];void bfs(int vt){ memset(dep, -1, sizeof(dep)); memset(gap, 0, sizeof(gap)); gap[0] = 1; int front = 0, rear = 0; dep[vt] = 0; q[rear++] = vt; while (front != rear) { int u = q[front++]; for (int i = first[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (dep[v] != -1)continue; q[rear++] = v; dep[v] = dep[u] + 1; gap[dep[v]]++; } }}int S[maxn];int sap(int vs, int vt, int VN) //VN表示总的点数,vs表示起点,vt表示终点 { bfs(vt); memcpy(cur, first, sizeof(first)); int top = 0, u = vs, ans = 0; while (dep[vs]<VN) { if (u == vt) { int Min = INF, inser; for (int i = 0; i<top; i++) { if (Min>edge[S[i]].cap - edge[S[i]].flow) { Min = edge[S[i]].cap - edge[S[i]].flow; inser = i; } } for (int i = 0; i<top; i++) { edge[S[i]].flow += Min; edge[S[i] ^ 1].flow -= Min; //edge[S[i]].cap-=Min; //edge[S[i]^1].cap+=Min; } ans += Min; top = inser; u = edge[S[top] ^ 1].to; 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] = i; break; } } if (flag) { S[top++] = cur[u]; u = v; continue; } int Min = VN; for (int i = first[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 != vs)u = edge[S[--top] ^ 1].to; } return ans;}int vis[100];void bfs(){ memset(vis, 0, sizeof(vis)); vis[vs] = 1; int front, rear; front = 1; rear = 1; q[rear] = vs; int x, v, i; while (front <= rear) { x = q[front]; front++; for (i = first[x]; i != -1; i = edge[i].next) { v = edge[i].to; if (vis[v])continue; if (edge[i].cap && edge[i].cap>edge[i].flow) { rear++; q[rear] = v; vis[v] = 1; } } } memset(gra, 0, sizeof(gra)); //gra保存的是答案 for (i = 1; i <= tot; i++) { int u = edge[i].from; int v = edge[i].to; if (u>v)swap(u, v); if ((vis[u] && !vis[v]) || (!vis[u] && vis[v])) { gra[u][v] = gra[v][u] = 1; } }}int main(){ int n, m, i, j, c, d, f, u, v; while (cin>>n>>m) { if (n == 0 && m == 0)break; init(); VN = n, vs = 1, vt = 2; for (i = 1; i <= m; i++) { scanf("%d%d%d", &c, &d, &f); addedge(c, d, f); addedge(d, c, f); } sap(1,2,n); bfs(); for (i = 1; i <= n; i++) { for (j = i + 1; j <= n; j++) { if (gra[i][j]) { printf("%d %d\n", i, j); } } } printf("\n"); } return 0;}
0 0
- UVA10480 打印最大流割掉了哪条边..
- uva10480 最大流最小割定理
- 割掉-----------------------------------------------割掉
- 有趣问题:长方形不断分割掉最大正方形(5640)
- 最大堆树状打印
- [POJ 3436]ACM Computer Factory[最大流][打印路径]
- POJ 1149 PIGS 用了三种求最大流的方法
- 世界最巨型大象“萨陶”惨死 面部被割掉
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- Codeforces510E Fox And Dinner(最大流-奇偶建图+路径打印)
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 统计输入最大行,并打印
- 打印1到最大的n位数
- 打印1到最大的n位数
- Windows下MySQL的安装配置
- 托管DLL和非托管DLL的区别
- 高级软件架构师实战培训阶段一,高级软件架构师实战培训阶段二
- 案例九 、jQuery游戏,来抽个奖吧
- 3500: PA2008 Cliquers
- UVA10480 打印最大流割掉了哪条边..
- XHTML 是什么?
- 递归递推练习 H
- 【Bzoj2654】tree
- codevs 1519 过路费(最小生成树+LCA)
- c++基础之const
- 背包问题(暴力)
- 队列
- 正则表达式