POJ 1274 网络流最大匹配
来源:互联网 发布:foxtable软件 编辑:程序博客网 时间:2024/06/06 08:31
用的FF算法,裸实现516ms++,记得当年的二分图16ms啊....
这里发两个模板吧,网络流才初学.. 弱爆了....
#include<iostream>#include<cstdio>#include<cmath>#define MN 422using namespace std;struct edge{int f,c;}g[MN][MN];struct node{int l,p,a;}list[MN];int s,t,ans,M,N;void init(){ s=1;t=N+M+2;ans=0; memset( g,0,sizeof(g) ); for( int i=1;i<=N;i++ ) { g[s][i+1].c=1; int n,u; scanf( "%d",&n ); for( int j=1;j<=n;j++ ) { scanf( "%d",&u ); g[i+1][N+u+1].c=1; } } for( int i=1;i<=M;i++ ) g[i+N+1][t].c=1;}int find(){ int i=1; while( i<=N+M+2&&(list[i].l==0||list[i].p!=0) )i++; if( i>N+M+2 ) return 0; else return i;}bool ford(){ memset( list,0,sizeof(list) ); list[s].l=s; list[s].a=9999999; while( list[t].l==0 ) { int i=find(); if( i==0 ) return true; for( int j=1;j<=N+M+2;j++ ) { if( list[j].l==0 &&( g[j][i].c||g[i][j].c ) ) { if( g[i][j].c-g[i][j].f ) { list[j].l=i; list[j].a=min(list[i].a,g[i][j].c-g[i][j].f); } if( g[j][i].f>0 ) { list[j].l=-i; list[j].a=min(list[i].a,g[j][i].f ); } } } list[i].p=1; } ans+=list[t].a; return false;}void change(){ int j,m,a; m=t;a=list[t].a; while( m!=s ) { j=m;m=abs(list[j].l); if( list[m].l>0 ) g[m][j].f+=a; if( list[m].l<0 ) g[j][m].f-=a; }}void work(){ bool p; while(1) { p=ford(); if( p ) break; else change(); } printf( "%d\n",ans );}int main(){ while( scanf("%d%d",&N,&M )!=EOF ) { init(); work(); }}
下面是匈牙利算法... 简洁啊....
#include<iostream>using namespace std;struct node{ int link[201]; int length;}point[201];int N,M;bool visited[201];int match[201];bool Match( int pre ){ int i; for( i=1;i<=point[pre].length;i++ ) { if( !visited[point[pre].link[i]] ) //point[pre].link[i] { visited[point[pre].link[i]]=true; if( match[point[pre].link[i]]==-1 || Match(match[point[pre].link[i]]) ) { match[point[pre].link[i]]=pre; return true; } } } return false;}int main(){ while( scanf("%d %d",&N,&M )!=EOF ) { memset( match,-1,sizeof(match) ); memset( point,0,sizeof(point) ); int i,j; int num; for( i=1;i<=N;i++ ) { scanf( "%d",&point[i].length ); for( j=1;j<=point[i].length;j++ ) scanf( "%d",&point[i].link[j]); } int ans=0; for( i=1;i<=M;i++ ) { memset( visited,false,sizeof(visited) ); if( Match(i) ) ans++; } printf( "%d\n",ans ); } return 0;}
- POJ 1274 网络流最大匹配
- POJ 3281 Dining 匹配,网络最大流
- 最大匹配问题 POJ 1274
- POJ 1087 A Plug for UNIX(网络流—最大流(最大二分匹配))
- POJ-1274(最大二分图匹配,将它转换成POJ-1273的最大流)
- POJ 1698 Alice's Chance 二分图多重匹配 网络最大流
- POJ 2112 Optimal Milking 二分+二分图多重匹配,网络最大流
- POJ 1274 二分图最大匹配
- poj 1274 二分图 最大匹配
- poj 1274 基础二分最大匹配
- poj 1274 二分图最大匹配
- poj 1274最大匹配匈牙利算法
- POJ 1274 The Perfect Stall 最大匹配
- poj 1274(二分图最大匹配)
- poj 网络最大流模板
- poj 1273 网络最大流
- POJ 1274 / POJ 1469 / POJ 2239 二分图最大匹配
- poj 2446 poj 1469 poj 1274 二分图最大匹配
- serviceBuilder学习网址
- 抽象工厂模式——学习笔记
- 设计的核心任务之一:层次的控制
- android 获取屏幕的分辨率
- 我的csdn博客正式开张
- POJ 1274 网络流最大匹配
- Nginx技术交流Q群:225942451(探讨安装、部署、模块开发、源码分析,及其他知名服务端开源软件)
- Linux 技巧:让进程在后台可靠运行的几种方法
- Java线程同步与多线程
- start.S进一步、更详细的、深入的解释和分析
- 高斯消元法(Gauss Elimination) 分析 & 题解 & 模板
- HDU 3938 Portal 并查集
- com.microsoft.sqlserver.jdbc.SQLServerException: 系统内存不足。请对大型 ResultSet 使用服务器端游标:解决方案
- U_BOOT_CMD命令的实现