挑战中
| 
 问题编号 | 问题名称 | 问题模型 | 转化模型 | 
| 1 | 飞行员配对方案问题 | 二分图最大匹配 | 网络最大流 | 
| 2 | 太空飞行计划问题 | 最大权闭合图 | 网络最小割 | 
| 3 | 最小路径覆盖问题 | 有向无环图最小路径覆盖 | 网络最大流 | 
| 4 | 魔术球问题 | 有向无环图最小路径覆盖 | 网络最大流 | 
| 5 | 圆桌问题 | 二分图多重匹配 | 网络最大流 | 
| 6 | 最长递增子序列问题 | 最多不相交路径 | 网络最大流 | 
| 7 | 试题库问题 | 二分图多重匹配 | 网络最大流 | 
| 8 | 机器人路径规划问题 | (未解决) | 最小费用最大流 | 
| 9 | 方格取数问题 | 二分图点权最大独立集 | 网络最小割 | 
| 10 | 餐巾计划问题 | 线性规划网络优化 | 最小费用最大流 | 
| 11 | 航空路线问题 | 最长不相交路径 | 最小费用最大流 | 
| 12 | 软件补丁问题 | 最小转移代价 | 最短路径 | 
| 13 | 星际转移问题 | 网络判定 | 网络最大流 | 
| 14 | 孤岛营救问题 | 分层图最短路径 | 最短路径 | 
| 15 | 汽车加油行驶问题 | 分层图最短路径 | 最短路径 | 
| 16 | 数字梯形问题 | 最大权不相交路径 | 最小费用最大流 | 
| 17 | 运输问题 | 网络费用流量 | 最小费用最大流 | 
| 18 | 分配问题 | 二分图最佳匹配 | 最小费用最大流 | 
| 19 | 负载平衡问题 | 最小代价供求 | 最小费用最大流 | 
| 20 | 深海机器人问题 | 线性规划网络优化 | 最小费用最大流 | 
| 21 | 最长k可重区间集问题 | 最大权不相交路径 | 最小费用最大流 | 
| 22 | 最长k可重线段集问题 | 最大权不相交路径 | 最小费用最大流 | 
| 23 | 火星探险问题 | 线性规划网络优化 | 最小费用最大流 | 
| 24 | 骑士共存问题 | 二分图最大独立集 | 网络最小割 | 
https://www.oj.swust.edu.cn/problem/show/1736
二分图最大匹配。超级源点连外籍飞行员,容量为1。匹配的外籍和英国飞行员间连一条边,容量为1。英国飞行员与超级汇点连一条边,容量为1。跑最大流,输出匹配的对。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <ctime> #include <vector> #include <queue> #include <map> #include <stack> #include <set> #include <bitset> using namespace std; typedef long long ll; typedef unsigned long long ull; #define ms(a, b) memset(a, b, sizeof(a)) #define pb push_back #define mp make_pair #define pii pair<int, int> #define IOS ios::sync_with_stdio(0);cin.tie(0); #define random(a, b) rand()*rand()%(b-a+1)+a #define pi acos(-1) const ll INF = 0x3f3f3f3f3f3f3f3fll; const int inf = 0x3f3f3f3f; const int maxn = 1000 + 10; const int maxm = 3000000 +10; const int mod = 1000000000; int maze[maxn][maxn]; int gap[maxn],dis[maxn],pre[maxn],cur[maxn]; int sap(int start,int ed,int nodenum){ memset(cur,0,sizeof(cur)); memset(dis,0,sizeof(dis)); memset(gap,0,sizeof(gap)); int u = pre[start]=start,maxflow=0,aug=-1; gap[0]=nodenum; while(dis[start]<nodenum){ loop: for(int v =cur[u];v<nodenum;v++){ if(maze[u][v]&&dis[u]==dis[v]+1){ if(aug==-1||aug>maze[u][v]) aug = maze[u][v]; pre[v]=u; u=cur[u]=v; if(v==ed){ maxflow+=aug; for(u=pre[u];v!=start;v=u,u=pre[u]){ maze[u][v]-=aug; maze[v][u]+=aug; } aug=-1; } goto loop; } } int mindis = nodenum-1; for(int v=0;v<nodenum;v++){ if(maze[u][v]&&mindis>dis[v]){ cur[u]=v; mindis=dis[v]; } } if((--gap[dis[u]])==0) break; gap[dis[u]=mindis+1]++; u=pre[u]; } return maxflow; } int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int n,m; while(~scanf("%d%d",&m,&n)){ memset(maze,0,sizeof(maze)); for(int i=1;i<=m;i++) maze[0][i]=1; for(int i=m+1;i<=n;i++) maze[i][n+1]=1; int x,y; while(true){ scanf("%d%d",&x,&y); if(x==-1&&y==-1) break; maze[x][y]=1; } int ans=sap(0,n+1,n+2); cout<<ans<<endl; for(int i=1;i<=m;i++){ for(int j=m+1;j<=n;j++){ if(maze[i][j]==0&&maze[j][i]==1){ printf("%d %d\n",i,j); break; } } } } return 0; }
原文:https://www.cnblogs.com/fht-litost/p/9709376.html