HDU 2448 Mining Station on the Sea(Floyd+最优匹配)

http://acm.hdu.edu.cn/showproblem.php?pid=2448

题意:

给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个船所在的油田编号,问你让这N条船,每条都回到1个港口去(每个港口最多只能容纳一条船),问你这N条船行走的总距离最短是多少?

分析:

其实每条船回到任意一个港口去都有一个距离(用Floyd算法算出的最短距离). 建立二分图: 我们把二分图左边放N个港口,右边放N条船,如果第j条船到第i个港口的距离为x,那么就在右j点与左i点之间连一条权值为x的边.

最终答案即为求 该二分图的最优匹配权值是多少?因为原问题N条船回到N个对应的港口行走总最短距离与现问题二分最优匹配的权值是一一对应的关系.(仔细验证一下,看看是不是一一对应的关系,每一个船只靠岸方案 对应了一个二分图的匹配方案 , 每一个二分图的匹配方案对应了一个船只靠岸方案)

       注意:本题求得是最小花费,而最优匹配求得是最大值.所以我们需要把所有二分图的边权值取负.且港口到油田是单向路径,一定不能添加双向边,因为添加了双向边,会把港口作为中转站.

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+5;struct Max_Match
{int n,W[maxn][maxn];int Lx[maxn],Ly[maxn];bool S[maxn],T[maxn];int left[maxn];bool match(int i){S[i]=true;for(int j=1;j<=n;j++)if(Lx[i]+Ly[j]==W[i][j] && !T[j]){T[j]=true;if(left[j]==-1 || match(left[j])){left[j]=i;return true;}}return false;}void update(){int a=1<<30;for(int i=1;i<=n;i++)if(S[i])for(int j=1;j<=n;j++)if(!T[j])a=min(a, Lx[i]+Ly[j]-W[i][j]);for(int i=1;i<=n;i++){if(S[i]) Lx[i] -=a;if(T[i]) Ly[i] +=a;}}int solve(int n){this->n=n;memset(left,-1,sizeof(left));for(int i=1;i<=n;i++){Lx[i]=Ly[i]=0;for(int j=1;j<=n;j++)Lx[i]=max(Lx[i],W[i][j]);}for(int i=1;i<=n;i++){while(true){for(int j=1;j<=n;j++) S[j]=T[j]=false;if(match(i)) break;else update();}}int ans=0;for(int i=1;i<=n;i++)ans += W[left[i]][i];return -ans;//注意取负数}
}KM;#define INF 1e9
int dist[300+10][300+10];
void floyd(int n)
{for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(dist[i][k]< INF && dist[k][j]<INF)dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);
}int main()
{int n,m,k,p;int station_id[maxn];while(scanf("%d%d%d%d",&n,&m,&k,&p)==4){for(int i=1;i<=n;i++)scanf("%d",&station_id[i]);for(int i=1;i<=n+m;i++)for(int j=1;j<=n+m;j++)dist[i][j]= i==j?0:INF;while(k--){int u,v,w;scanf("%d%d%d",&u,&v,&w);dist[u+n][v+n]=dist[v+n][u+n]=w;}while(p--){int u,v,w;scanf("%d%d%d",&u,&v,&w);dist[u][v+n]=w;//港口到油田是单向的}floyd(n+m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)KM.W[i][j] = -dist[i][station_id[j]+n];//注意取负数printf("%d\n",KM.solve(n));}return 0;
}

HDU 2448 Mining Station on the Sea(Floyd+最优匹配)相关推荐

  1. HDU 2448 Mining Station on the Sea

    预处理轮船到各个港口的最短路径,然后KM解之即可. /*HDU 2448*/ #include <iostream> #include <cstdlib> #include & ...

  2. hdu 2448 Mining Station on the Sea(最短路+费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个 ...

  3. HDU 2448 Mining Station on the Sea 最短路+KM

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意:有n个港口n条船,m个采矿站,船只能在能够通信的采矿站之间或者能够通信的港口和采矿站之间航行, ...

  4. HDU-2448 Mining Station on the Sea

    先根据不同的起点跑最短路,记录距离,从而建立二分图求最小匹配. 一开始我求最短路的时候我把港口直接加到图中,然后发现进了港口就不能出来了,所以连接港口的边就要从双向边改成单向边----这也搞得我n和m ...

  5. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

  6. hdu 3879 Base Station 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 A famous mobile communication company is plannin ...

  7. HDU - 7031 Power Station of Art 思维 + 二分图模型

    传送门 文章目录 题意: 思路: 题意: 给你两个完全相同的图,现在两个图的每个点上有一个值valvalval并且有一个颜色colcolcol,颜色只能为红色或黑色,注意两个图只是长得一样,点的权值和 ...

  8. HDU - 2066 一个人的旅行 (floyd/dijkstra)

    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿 ...

  9. hdu 1874畅通工程续(基础Floyd)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

最新文章

  1. 《程序员做饭指南》霸榜 GitHub!不仅有量筒、烧杯,还用上了数学公式?
  2. css中单位px和em,rem的区别
  3. 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
  4. OpenCV放大图像:多输出
  5. ConcurrentHashMap的源码分析-扩容过程图解
  6. 什么是JAX-RS注释? (第2部分)
  7. 初步使用github,并上传下载文件
  8. Smobiler 4.4 更新预告 Part 1(Smobiler能让你在Visual Studio上开发APP)
  9. 小程序 字号设置 slider滚动改变大小_SteerMouse for mac(鼠标设置工具) v5.4.3
  10. 对称式加密和非对称式加密
  11. Sublime Text 3 Key
  12. android依赖alert样式,Android - AlertDialog样式
  13. win7上python2.7连接mysql数据库
  14. 统计学中的有效性和可靠性的概念
  15. android studio内容提供者(查看短信的猫)点击查看短信,闪退,无法显示短信内容。(附程序源代码,以及解决办法)
  16. 苹果真的老了!iphone XR降价跌至6500,与iphone X有很大差距
  17. 为什么我可以正常上网,却ping不通自己的外网IP呢???
  18. 移动硬盘只读解决办法
  19. 使用函数sample进行抽样
  20. Vue引入并使用md文件方法

热门文章

  1. 关闭VM中虚拟机与主机时间同步
  2. 一个体育生的编程之路(一)
  3. 【Leetcode】444. Sequence Reconstruction
  4. PS磨皮滤镜Portraiture2.3简体中文绿色版32b/64b
  5. PTA 7-66 华氏温度转换为摄氏温度
  6. 湖南湘中计算机学校历任校长,2005学年度湖南省中等职业学校.doc
  7. bzoj4605 崂山白花蛇草水 权值线段树套kd树
  8. 计算机专业教师演讲稿,计算机专业演讲稿2篇
  9. 闲谈隐性成本(太多人的思维盲区)
  10. 【普组模拟赛】马农(farmer.pas/cpp)