【最大流,二分图匹配】【hdu2063】【过山车】
来源:互联网 发布:cf新版本优化1 编辑:程序博客网 时间:2024/04/30 17:12
题意:裸的求二分图匹配
建立一个源点 连向一边所有的点 容量为1;
另外一边点都连向汇点 容量为1;
二分图的边容量也为1
源点汇点求一遍最大流即可
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <ctime>#include <algorithm>#include <iostream>#include <sstream>#include <string>#define oo 0x13131313using namespace std;const int MAXN=2000+5;const int MAXM=10000+5;const int INF=0x3f3f3f3f;struct Edge{ int to,next,cap,flow; void get(int a,int b,int c,int d) { to=a;next=b;cap=c;flow=d; }}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];void init(){ tol=0; memset(head,-1,sizeof(head));}//单向图三个参数,无向图四个参数void addedge(int u,int v,int w,int rw=0){ edge[tol].get(v,head[u],w,0);head[u]=tol++; edge[tol].get(u,head[v],rw,0);head[v]=tol++;}int sap(int start,int end,int N){ memset(gap,0,sizeof(gap)); memset(dep,0,sizeof(dep)); memcpy(cur,head,sizeof(head)); int u=start; pre[u]=-1; gap[0]=N; int ans=0; while(dep[start]<N) { if(u==end) { int Min=INF; for(int i=pre[u];i!=-1;i=pre[edge[i^1].to]) if(Min>edge[i].cap-edge[i].flow) Min=edge[i].cap-edge[i].flow; for(int i=pre[u];i!=-1;i=pre[edge[i^1].to]) { edge[i].flow+=Min; edge[i^1].flow-=Min; } u = start; ans+=Min; 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]=pre[v]=i; break; } } if(flag) { u=v; continue; } int Min=N; for(int i=head[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!=start) u=edge[pre[u]^1].to; } return ans;}int KK,MM,NN;void input(){ int a,b; for(int i=1;i<=KK;i++) { scanf("%d%d",&a,&b); addedge(a,b+MM,1); }}void solve(){ int ANS; for(int i=1;i<=MM;i++) { addedge(MM+NN+1,i,1); } for(int i=MM+1;i<=MM+NN;i++) { addedge(i,MM+NN+2,1); } ANS=sap(MM+NN+1,MM+NN+2,MM+NN+2); printf("%d\n",ANS);}void File(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout);}int main(){ // File(); while(cin>>KK>>MM>>NN&&KK) { init(); input(); solve(); }}
0 0
- 【最大流,二分图匹配】【hdu2063】【过山车】
- HDU2063 过山车(二分图最大匹配)
- Hdu2063—过山车 二分图最大匹配
- HDU2063 过山车 【二分图·最大匹配】
- 【二分图最大匹配】【HDU2063】过山车
- HDU2063过山车 匈牙利二分图最大匹配
- hdu2063 过山车(二分图最大匹配基础)
- hdu2063 过山车【二分图匹配】
- hdu2063 过山车 二分图最大匹配 匈牙利算法
- 二分图最大匹配-增广路-hdu2063-过山车
- hdu2063 过山车 二分图/最大匹配(匈牙利算法)
- 【HDU2063】过山车(二分图最大匹配,匈牙利算法)
- HDU2063过山车(二分匹配)
- hdu2063 过山车 二分匹配
- 二分匹配 HDU2063 过山车
- HDU2063--过山车(二分匹配,二分图)
- 【二分图匹配】HDU2063-过山车【模板题】
- hdu2063[过山车] 二分图匹配 匈牙利算法
- liunx内核分析(4)
- 快速输入输出
- unix网络编程1 基础知识
- ZOJ 3180 Number Game(数学啊 )
- 04-树5. Complete Binary Search Tree (30)
- 【最大流,二分图匹配】【hdu2063】【过山车】
- poj 2385 Apple Catching DP
- 安装intelhaxm-android.exe时,屏幕一闪而过
- 考了语文数学的学生
- UILabel 调整行间距
- 设计模式之--State模式
- 输入挂(数据输入加速)
- Hadoop——创建文件夹
- Python学习:PyCharm 使用简介(转)