P2756 飞行员配对方案问题 网络流
时间:2019-11-05
本文章向大家介绍P2756 飞行员配对方案问题 网络流,主要包括P2756 飞行员配对方案问题 网络流使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10005, inf = 0x3f3f3f; 4 struct Edge { 5 int from, to, cap, flow; 6 }; 7 8 struct Dinic { 9 int n, m, s, t; 10 vector<Edge> edges; 11 vector<int> G[maxn]; 12 bool vis[maxn]; 13 int d[maxn]; 14 int cur[maxn]; 15 16 void AddEdge(int from, int to, int cap) { 17 edges.push_back((Edge){from, to, cap, 0}); 18 edges.push_back((Edge){to, from, 0, 0}); 19 m = edges.size(); 20 G[from].push_back(m-2); 21 G[to].push_back(m-1); 22 } 23 bool bfs() { 24 memset(vis, 0, sizeof(vis)); 25 queue<int> que; 26 que.push(s); 27 d[s] = 0; 28 vis[s] = true; 29 while (!que.empty()) { 30 int x = que.front(); que.pop(); 31 for (int i = 0; i < G[x].size(); ++i) { 32 Edge& e = edges[G[x][i]]; 33 if (!vis[e.to] && e.cap > e.flow) { 34 vis[e.to] = true; 35 d[e.to] = d[x] + 1; 36 que.push(e.to); 37 } 38 } 39 } 40 return vis[t]; 41 } 42 int dfs(int x, int a) { 43 if (x == t || a == 0) return a; 44 int flow = 0, f; 45 for (int& i = cur[x]; i < G[x].size(); ++i) { 46 Edge& e = edges[G[x][i]]; 47 if (d[x] + 1 == d[e.to] && (f = dfs(e.to, min(a, e.cap-e.flow))) > 0) { 48 e.flow += f; 49 edges[G[x][i]^1].flow -= f; 50 flow += f; 51 a -= f; 52 if (a == 0) break; 53 } 54 } 55 return flow; 56 } 57 int maxflow(int s, int t) { 58 this->s = s; this->t = t; 59 int flow = 0; 60 while (bfs()) { 61 memset(cur,0,sizeof(cur)); 62 flow += dfs(s,inf); 63 } 64 return flow; 65 } 66 }dinic; 67 int main() { 68 int m, n; scanf("%d%d",&m,&n); 69 while (true) { 70 int i, j; scanf("%d%d",&i,&j); 71 if (i == -1 && j == -1) break; 72 dinic.AddEdge(i,j,1); 73 } 74 int s = n+1, t = n+2; 75 for (int i = 1; i <= m; ++i) { 76 dinic.AddEdge(s,i,1); 77 } 78 for (int i = m+1; i <= n; ++i) { 79 dinic.AddEdge(i,t,1); 80 } 81 int ans = dinic.maxflow(s,t); 82 if (ans == 0) puts("No Solution!"); 83 else { 84 printf("%d\n",ans); 85 for (int i = 0; i < dinic.edges.size(); ++i) { 86 if (dinic.edges[i].from == s) continue; 87 if (dinic.edges[i].to == t) continue; 88 if (dinic.edges[i].flow == 1) { 89 printf("%d %d\n",dinic.edges[i].from,dinic.edges[i].to); 90 } 91 } 92 } 93 return 0; 94 }
原文地址:https://www.cnblogs.com/wstong/p/11797923.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法