hdu 2063(二分匹配)
2016-04-29 19:31
225 查看
<span style="font-size:18px;">#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> using namespace std; const int maxn=1002,INF=1000000000; //最大流模板 struct Edge { int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){} }; struct EdmondsKarp { int n,m,i; vector<Edge> edges; vector<int> G[maxn]; int a[maxn]; int p[maxn]; void init(int n) { for(i=0;i<=n;i++)G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap) { edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } int Maxflow(int s,int t) { int flow=0,u; for(;;) { memset(a,0,sizeof(a)); queue<int> Q; Q.push(s); a[s]=INF; while(!Q.empty()) { int x=Q.front(); Q.pop(); for(i=0;i<G[x].size();i++) { Edge& e=edges[G[x][i]]; if(!a[e.to]&&e.cap>e.flow) { p[e.to]=G[x][i]; a[e.to]=min(a[x],e.cap-e.flow); Q.push(e.to); } } if(a[t])break; } if(!a[t])break; for(u=t;u!=s;u=edges[p[u]].from) { edges[p[u]].flow+=a[t]; edges[p[u]^1].flow-=a[t]; } flow+=a[t]; } return flow;//flow是最大流。。 } }; int main() { EdmondsKarp ans; int k,M,N,s,t,i,j,x,y; while(scanf("%d",&k)!=EOF) { s=0;t=1001; if(k==0)break; scanf("%d%d",&M,&N); ans.init(1001); for(i=1;i<=M;i++)ans.AddEdge(s,i,1); for(i=1;i<=k;i++) { scanf("%d%d",&x,&y); ans.AddEdge(x,y+500,1); } for(i=501;i<501+N;i++)ans.AddEdge(i,t,1); printf("%d\n",ans.Maxflow(s,t)); } return 0; } </span>
<span style="font-size:18px;">//摘录自紫书:针对无权图需要求出包含边数最多的匹配,即二分图的最大基数匹配。增加一个源点s,一个汇点t。从s向每个X连一条容量为1的弧,从所有的Y向t连一条容量为1的弧,最后把每条边变成一条由X指向Y的有向弧,容量为1.只要求出s到t的最大流,则原图中所有流量为1的弧对应了最大基数匹配。</span>
<span style="font-size:18px;"> </span>
相关文章推荐
- 异或
- Linux虚拟机中安装JDK(以root用户身份安装)
- I/O多路复用---select、poll、epoll
- Node+Express+Jade
- 内核空间与用户空间打印调用栈
- mysql数据库远程访问设置方法
- Leetcode Missing Number 268
- linux学习笔记入门之目录结构和文件基本操作
- HttpURLConnection POST 对象给 Servlet
- socket04---流协议和粘包问题及解决
- 如何让ListView的item不可点击
- mysql5.7忘记root密码以及授权远程访问解决方案
- Problem N
- Problem N
- (34)Spring Boot的启动器Starter详解【从零开始学Spring Boot】
- 学生排序
- Jsoup的用法案例
- 初始lucene与solr
- libLAS 读写点云数据(las2txt)
- 广播程序开发记录