您的位置:首页 > 理论基础 > 计算机网络

【网络流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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: