POJ 2195(二分图最大权匹配)
2016-02-21 21:13
337 查看
题目链接:POJ 2195
解题思路:
这题可以转化成权匹配或者费用流问题。首先需要根据输入构图,将问题转成权匹配问题,之后套用KM算法即可。KM算法入门很好的一道题目。
代码:
解题思路:
这题可以转化成权匹配或者费用流问题。首先需要根据输入构图,将问题转成权匹配问题,之后套用KM算法即可。KM算法入门很好的一道题目。
代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define INF 0x3f3f3f3f #define MAXN 105 using namespace std; int n,a[MAXN][MAXN],vx[MAXN],vy[MAXN],lx[MAXN],ly[MAXN],pre[MAXN],slack[MAXN]; int N,M,cnth,cntm; struct point{ int x,y; }tmph[MAXN],tmpm[MAXN]; char st[MAXN][MAXN]; bool dfs(int index) { vx[index]=1; for(int i=1;i<=n;i++) { if(!vy[i]&&lx[index]+ly[i]==a[index][i]) { vy[i]=1; if(!pre[i]||dfs(pre[i])) { pre[i]=index; return 1; } } else if(!vy[i]&&lx[index]+ly[i]>a[index][i]) slack[i]=min(slack[i], lx[index]+ly[i]-a[index][i]); } return 0; } int KM() { memset(ly,0,sizeof(ly)); for(int i=1;i<=n;i++) { lx[i]=-INF; for(int j=1;j<=n;j++) lx[i]=max(lx[i],a[i][j]); } int ans=0,d; memset(pre,0,sizeof(pre)); for(int i=1;i<=n;i++) { memset(slack,INF,sizeof(slack)); while(1) { memset(vx,0,sizeof(vx)); memset(vy,0,sizeof(vy)); if(dfs(i)) break; d=INF; for(int i=1;i<=n;i++) if(!vy[i]) d=min(d,slack[i]); if(d==INF) return -1; //no matching for(int j=1;j<=n;j++) if(vx[j]) lx[j]-=d; for(int j=1;j<=n;j++) if(vy[j]) ly[j]+=d; } } for(int i=1;i<=n;i++) ans+=a[pre[i]][i]; return ans; } int main() { while(~scanf("%d %d", &N, &M)) { if(!N&&!M) break; cnth=cntm=0; getchar(); for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { scanf("%c",&st[i][j]); if(st[i][j]=='m') cntm++,tmpm[cntm].x=i, tmpm[cntm].y=j; if(st[i][j]=='H') cnth++,tmph[cnth].x=i, tmph[cnth].y=j; } getchar(); } n=cntm; for(int i=1;i<=cntm;i++) for(int j=1;j<=cnth;j++) a[i][j]=-(abs(tmpm[i].x-tmph[j].x)+abs(tmpm[i].y-tmph[j].y)); printf("%d\n",-KM()); } return 0; }
相关文章推荐
- Android UI效果之绘图篇(一)
- 造轮子:Enum,int,string类型互转
- DLL劫持技术详解(lpk.dll)
- Java学习之SimpleDateFormat
- 黄聪:阿里云Windows2012服务器IIS8实现wordpress完美伪静态(ISAPIRewritev)
- 扩展欧几里得
- 构造方法
- Codeforces Round #343 (Div. 2) B. Far Relative’s Problem (线段树+区间更新+单点查询)
- Dev-C++ 小问题锦集
- iOS--Runtime
- 物联网平台设计心得:图表数据可视化
- Klib - C语言通用库
- 《VMware虚拟化与计算应用案例详解》第五次印刷!
- 内核的编译原理
- 你这么年轻你急什么?人生又不是商业模式!
- Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake
- 理解 Objective-C Runtime
- 45个JavaScript小技巧
- android 数据库更新
- java.lang.Exception: Socket bind failed