最大权二分匹配(最大费用流) —— Best couple (玲珑学院 1047)
2016-11-06 01:26
344 查看
题目链接:
http://www.ifrog.cc/acm/problem/1047
分析:
给出n个男孩和m个女孩,男孩在标号为1~n的城市里,女孩在标号为n+1~n+m的城市里。再给出每个城市之间的距离,-1表示不可达。求怎么配对使得每一对之间的距离和最大。
题解:
这是一道很明显的最大权二分图匹配,可以用KM做,也可以用最大费用流来做,这里用费用流的做法:将边权乘以-1后用最小费用最大流来做即可。
注意:
应先对给出的城市之间的距离来一遍Floyd求出每两座城市间的最短路。
AC代码:
http://www.ifrog.cc/acm/problem/1047
分析:
给出n个男孩和m个女孩,男孩在标号为1~n的城市里,女孩在标号为n+1~n+m的城市里。再给出每个城市之间的距离,-1表示不可达。求怎么配对使得每一对之间的距离和最大。
题解:
这是一道很明显的最大权二分图匹配,可以用KM做,也可以用最大费用流来做,这里用费用流的做法:将边权乘以-1后用最小费用最大流来做即可。
注意:
应先对给出的城市之间的距离来一遍Floyd求出每两座城市间的最短路。
AC代码:
/************************************************************************* > File Name: test.cpp > Author: Akira > Mail: qaq.febr2.qaq@gmail.com ************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cmath> #include <vector> #include <set> #include <list> #include <ctime> typedef long long LL; typedef unsigned long long ULL; typedef long double LD; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Sqr(a) ((a)*(a)) using namespace std; #define MaxN 210 #define MaxM 40005 #define INF 0x3f3f3f3f #define bug cout<<88888888<<endl; #define MIN(x,y) (x<y?x:y) #define MAX(x,y) (x>y?x:y) int MAP[MaxN][MaxN]; int T; int N,M; struct node { int u,v,flow,cost; int next; }edge[MaxM]; int cont; int head[MaxN]; int n;//node numbers void add(int u, int v, int flow, int cost) { edge[cont].u = u; edge[cont].v = v; edge[cont].flow = flow; edge[cont].cost = cost; edge[cont].next = head[u]; head[u] = cont++; } void Add(int u, int v, int flow , int cost) { add(u,v,flow,cost); add(v,u,0,-cost); } void init() { CLR(MAP); memset(head, -1,sizeof(head)); cont = 0; n = 0; } bool vis[MaxN]; int dist[MaxN]; int pre[MaxN]; int s,t,aug; int ans; //记录最小费用 int KK; //记录最大流 bool SPFA() { int k,p,V; queue <int> q; MST(pre,-1); CLR(vis); for(int i=0;i<=n;i++) dist[i] = INF; q.push(s); vis[s] = 1; dist[s] = 0; while(!q.empty())//寻找最短路 { k = q.front(); q.pop(); vis[k] = 0; for(p = head[k]; p!=-1; p=edge[p].next) { V = edge[p].v; if(edge[p].flow && (edge[p].cost + dist[k] < dist[V])) { dist[V] = edge[p].cost + dist[k]; pre[V] = p; if(!vis[V]) { q.push(V); vis[V] = 1; } } } } if(dist[t] == INF) return false; aug =INF+1; for(p = pre[t]; p!= -1; p = pre[edge[p].u])//沿着增广路走一遍 { aug = min(aug, edge[p].flow); } for(p=pre[t]; p!= -1; p = pre[edge[p].u])//更新残余网络 { edge[p].flow -= aug; edge[p^1].flow += aug; } ans += dist[t]*aug; KK += aug; return true; } int main() { scanf("%d", &T); while(T--) { init(); scanf("%d%d", &N, &M); int len = N+M; for(int i=1;i<=len;i++) for(int j=1;j<=len;j++) { int x; scanf("%d", &x); if(x!= -1) MAP[i][j] = x; else MAP[i][j] = INF; //cout << i << " - " << j << " : " <<MAP[i][j] <<endl; } //Floyd求两座城市间最短路 预处理操作 for(int k=1;k<=len;k++) for(int i=1;i<=len;i++) for(int j=1;j<=len;j++) { if(MAP[i][j]>MAP[i][k]+MAP[k][j]) MAP[i][j]=MAP[i][k]+MAP[k][j]; } for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) { //cout << i << " - " << j+N << " : " <<MAP[i][j+N] <<endl; if(MAP[i][j+N]<INF) Add(i,j+N,1,-MAP[i][j+N]); //乘以-1 } s= 0; t = N+M+1; for(int i=1;i<=N;i++) Add(s, i, 1, 0); for(int i=1;i<=M;i++) Add(i+N, t, 1, 0); n = 2+N+M; ans = 0; KK=0; while(SPFA()); cout << -ans << endl; } system("pause"); }
相关文章推荐
- 【玲珑杯 1047】【二分匹配 KM算法或者费用流】Best couple【定义男女生的距离为最短距离,求匹配之后使得总距离最大】
- POJ 1274 The Perfect Stall(二分匹配 最大匹配数)
- POJ 2594 最大二分匹配 最小路径覆盖
- poj 3692 Kindergarten(二分匹配,最大独立集)
- [BZOJ3130][Sdoi2013]费用流(结论+二分答案+最大流)
- HDU 2444 黑白染色判二分图+二分最大匹配
- 【二分】【字符串哈希】【二分图最大匹配】【最大流】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem I. Minimum Prefix
- hdu1179Ollivanders: Makers of Fine Wands since 382 BC. (二分最大匹配)
- hdu 1068 Girls and Boys(最大独立集,二分匹配)
- 最大流 & 二分匹配模板
- 求最大二分匹配(模板)
- HDU 2819 矩阵 最大二分匹配
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题
- HDU1281棋盘游戏-最大二分匹配
- ZOJ 1654 Place the Robots(最大二分匹配)
- hdu3829 二分匹配 最大独立集
- hdu 2063 过山车 基础最大二分匹配
- loj 1150(spfa预处理+二分+最大匹配)
- hdu 4619 (二分匹配,最大匹配)
- ZOJ 1516 Uncle Tom's Inherited Land(二分匹配 最大匹配 匈牙利啊)