POJ 1422
2015-06-09 14:01
302 查看
#include <iostream> #define MAXN 350 using namespace std; int mat[MAXN][MAXN]; bool mark[MAXN]; int match[MAXN]; int graph_match(int n,int mat[][MAXN],int * match); int main() { //freopen("acm.acm","r",stdin); int test; int n; int m; int u; int v; int i; int j; cin>>test; while(test --) { memset(mat,0,sizeof(mat)); memset(match,-1,sizeof(match)); cin>>n; cin>>m; for(i = 0; i < m; ++ i) { cin>>u; cin>>v; -- u; -- v; mat[u][v+n] = 1; } cout<<n-graph_match(n*2,mat,match)<<endl; } } //一般图最大匹配,邻接阵形式,复杂度O(n^3) //返回匹配顶点对数,match返回匹配,未匹配顶点match值为-1 //传入图的顶点数n和邻接阵mat //graph_match()为最终调用函数 int aug(int n,int mat[][MAXN],int* match,int* v,int now){ int i,ret=0; v[now]=1; for (i=0;i<n;i++) if (!v[i]&&mat[now][i]){ if (match[i]<0) match[now]=i,match[i]=now,ret=1; else{ v[i]=1; if (aug(n,mat,match,v,match[i])) match[now]=i,match[i]=now,ret=1; v[i]=0; } if (ret) break; } v[now]=0; return ret; } int graph_match(int n,int mat[][MAXN],int * match){ int v[MAXN],i,j; for (i=0;i<n;i++) v[i]=0,match[i]=-1; for (i=0,j=n;i<n&&j>=2;) if (match[i]<0&&aug(n,mat,match,v,i)) i=0,j-=2; else i++; for (i=j=0;i<n;i++) j+=(match[i]>=0); return j/2; }
相关文章推荐
- 【资料整理】cisco [OSI, IP Address, Network Segment, Subnet Mask]
- 80070005 错误处理
- Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img.
- Android Framework 记录之一
- YUV格式说明
- Linux开机启动、网络、双屏显示
- windows远程连接不能复制粘贴
- 《Web应用测试》笔记(第3章-软件测试基础)
- UILabel的属性总结
- Dictionary的TryGetValue方法
- visual studio 快捷键及快捷使用方式
- POJ 1416
- POJ 1419
- 使用storyboard设置按钮边框属性(颜色,宽度,圆角)
- Svn 笔记—— Hooks
- Auto reloading enabled
- 理义科技展出35指55寸纯玻璃电容式触控面板
- Direct3D 11 中的资源介绍
- IOS开发基础知识--碎片14
- 【资料整理】cisco [nat, pat]