【网络流24题01】飞行员配对方案问题
2018-02-02 20:20
441 查看
题面传送机
Sol
网络流的一个模板题 , 重点在建图(貌似大部分网络流只要知道建图就可以搬模板了)建立超汇点E和超源点S 下面就是建图三步走
1,S与每个外籍飞行员连有向边 , 流量为1(只有1个这样的英国飞行员)
2,外籍飞行员和英国飞行员连有向边 , 流量为1(1个英国飞行员可以和1个外籍飞行员相连,毕竟人不能分身)
3,英国飞行员和E连有向边 , 流量为1
然后 , 愉快的搬模板吧!
Code
#include <iostream> #include <cstdio> #include <cctype> #include <cstring> #define inc(i) (i = -(~i)) #define dec(i) (i = ~(-i)) using namespace std; namespace fast { inline char Getchar() { static char buf[100001] , *p1 = buf , *p2 = buf; return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++; } inline int read() { int num = 0 , w = 1; char c = 0; while(!isdigit(c) && c != '-') c = Getchar(); if(c == '-') c = Getchar() , w = -1; while(isdigit(c)) num = num * 10 + c - '0' , c = Getchar(); return num * w; } inline void write(int x) { if(x < 0) putchar('-') , x = -x ; if(x / 10) write(x / 10); putchar(x % 10 + '0'); } } using namespace fast; const int N = 100 + 7 , M = N * N; int n , m , Head[N + N] , Next[M] , Node[M] , W[M] , tot = 1 , Dep[N + N] , ANS[M][2] , Ans_tot , Now[M]; inline void Add(int u , int v , int w) { Next[inc(tot)] = Head[u]; Head[u] = tot; W[tot] = w; Now[tot] = u; Node[tot] = v; } struct Queue { int Que[M + 7] , l , r; inline void cls() {l = 100 , r = 99;} inline int top() {return Que[l];} inline void push(int x) {Que[inc(r)] = x;} inline bool full() {return r >= l;} inline void pop() {inc(l);} }Q; inline bool BFS(int s , int e) { memset(Dep , 0 , sizeof(Dep)); Dep[s] = 1 , Q.cls() , Q.push(s); int u , v; while(Q.full()) { u = Q.top() , Q.pop(); for(int i = Head[u] ; i ; i = Next[i]) { v = Node[i]; if(!Dep[v] && W[i]) { Dep[v] = Dep[u] + 1; Q.push(v); } } } return Dep[e]; } inline int DFS(int u , int e , int lastc) { if(u == e || !lastc) return lastc; int Flow , v , Now = 0; for(int i = Head[u] ; i ; i = Next[i]) { v = Node[i]; if(Dep[v] == Dep[u] + 1 && W[i]) { Flow = DFS(v , e , min(lastc , W[i])); if(Flow) { W[i] -= Flow; W[i ^ 1] += Flow; Now += Flow; if(Now == lastc) break; } } } return Now; } inline int Max_Flow(int s , int e) { int Ans = 0; while(BFS(s , e)) Ans += DFS(s , e , 2147483647); return Ans; } int main() { n = read() , m = read(); int u = read() , v = read() , s = n + m + 1 , e = n + m + 2; while(u != -1 && v != -1) { Add(v , u + m , 1); Add(u + m , v , 0); u = read() , v = read(); } for(int i = 1 ; i <= n ; inc(i)) Add(i + m , e , 1) , Add(e , i + m , 0); for(int i = 1 ; i <= m ; inc(i)) Add(s , i , 1) , Add(i , s , 0); int Flow = Max_Flow(s , e); if(!Flow) { puts("No Solution!"); return 0; } printf("%d\n" , Flow); for(int i = 1 ; i <= tot ; inc(i) , inc(i)) { if(Now[i] != s && Node[i] != s && Now[i] != e && Node[i] != e && W[i]) printf("%d %d\n" , Now[i] - m , Node[i]); } return 0; }
相关文章推荐
- P3386 【模板】二分图匹配(网络流与线性规划24题01飞行员配对方案问题)
- 网络流与线性规划24题01飞行员配对方案问题
- 网络流与线性规划24题01飞行员配对方案问题
- 网络流与线性规划24题01飞行员配对方案问题
- 线性规划与网络流24题——01飞行员配对方案问题
- 线性规划与网络流24题——01飞行员配对方案问题
- 网络流24题之T1——飞行员配对方案问题
- 网络流24题之飞行员配对方案问题(nefu475)
- 【网络流24题----01】飞行员配对方案问题
- P2756 飞行员配对方案问题(网络流24题之一)
- 网络流24题 飞行员配对方案问题
- 网络流24题——飞行员配对方案问题
- 网络流24题1 飞行员配对方案问题
- 网络流24题 01 飞行员配对方案问题 (多源多汇点+最大流)
- 网络流24题1 飞行员配对方案问题
- 网络流24题之T1 飞行员配对方案问题
- 网络流24题之飞行员配对方案问题
- kyeremal-网络流24题T1-飞行员配对方案问题
- 网络流24题1 飞行员配对方案问题 ssl 2601
- 「网络流24题」飞行员配对方案问题