题目链接:点击查看

题目大意:给出n个城市,再给出m条有向的道路,问若想以一个或多个环的形式遍历所有的城市一次,所需要的最小权值是多少

题目分析:刚拿到这个题目是有点懵的,因为不知道题目让求什么,其实转换一下就豁然开朗了,首先是遍历一次和每个城市都要经过一次(除了每个环起点和终点的城市可以经过两次),我们可以将n个城市抽象为一个二分图,两个子集分别是每个点的入度点和出度点,这样当n个入度点和n个出度点完备匹配后,就至少能形成一个环了

这里从网上拿大佬的一个图来理解一下吧:

上图中点1和点2可以成环,点3点4和点5也可以成环,就不用多说了吧

因为让求路径之和最小,也就是最小权匹配,而且还是完备匹配,所以直接挂KM模板就好了,记得让权值取负,这个题目是有重边和零边的,注意处理一下就好了,小细节

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=210;int n,m;int la[N],lb[N];//顶标bool visa[N],visb[N];//访问标记int maze[N][N];//边权int match[N];//右部点匹配了哪一个左部点int upd[N];bool dfs(int x)
{visa[x]=true;//访问标记:x在交错树中for(int i=1;i<=n;i++){if(!visb[i]){if(la[x]+lb[i]-maze[x][i]==0)//相等子图{visb[i]=true;//访问标记:y在交错树中if(!match[i]||dfs(match[i])){match[i]=x;return true;}}elseupd[i]=min(upd[i],la[x]+lb[i]-maze[x][i]);}}return false;
} int KM()
{memset(match,0,sizeof(match));for(int i=1;i<=n;i++){la[i]=-inf;lb[i]=0;for(int j=1;j<=n;j++)la[i]=max(la[i],maze[i][j]);}for(int i=1;i<=n;i++){while(1)//直到左部点找到匹配{memset(visa,false,sizeof(visa));memset(visb,false,sizeof(visb));memset(upd,inf,sizeof(upd));if(dfs(i))break;int delta=inf;for(int j=1;j<=n;j++)if(!visb[j])delta=min(delta,upd[j]);for(int j=1;j<=n;j++)//修改顶标{if(visa[j])la[j]-=delta;if(visb[j])lb[j]+=delta;}}}int ans=0;for(int i=1;i<=n;i++)ans+=maze[match[i]][i];return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){memset(maze,-inf,sizeof(maze));scanf("%d%d",&n,&m);while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);maze[u][v]=max(-w,maze[u][v]);}printf("%d\n",-KM());}return 0;
}

HDU - 3488 Tour(二分图最小权匹配+KM)相关推荐

  1. POJ - 3565 Ants(二分图最小权匹配+KM+思维)

    题目链接:点击查看 题目大意:给出n个蚂蚁和n个苹果树的坐标,我们需要求出每个蚂蚁平时觅食所要去的苹果树,必须保证所有路径不能有交叉 题目分析:因为所有的边不能有交叉,所以我们选择距离最短的两个点匹配 ...

  2. POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...

  3. UVALive 3353 - Optimal Bus Route Design(二分图最小权匹配)

    题目链接 https://cn.vjudge.net/problem/UVALive-3353 [题意] 给你n个点(n<=100)的有向带权图,你要找到n个有向环,使得每个点恰好属于一个环,要 ...

  4. 牛客多校10 - Identical Trees(dp+二分图最小权匹配)

    题目链接:点击查看 题目大意:给出两个同构树 tree1 和 tree2 ,问最少需要改变多少个结点的标号,可以使得这两棵树相同 题目分析:直接 dfs 维护 dp 就好了,dp[ i ][ j ] ...

  5. HDU 1533 二分图最小权匹配 Going Home

    带权二分图匹配,把距离当做权值,因为是最小匹配,所以把距离的相反数当做权值求最大匹配. 最后再把答案取一下反即可. 1 #include <iostream> 2 #include < ...

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

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

  7. pku 2195 Going Home KM最小权匹配问题

    http://poj.org/problem?id=2195 在一个n*m的方格里有nx人(m)和ny个房子(H),(nx = ny)人每次可以向四周移动单位距离,花费1¥,求最小花费是每个人都能进入 ...

  8. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

  9. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第27期)
  2. 对象的比较与排序(五):C#运算符重载
  3. MySQL(10)数据库实现高可用架构之MHA
  4. 第三次学JAVA再学不好就吃翔(part64)--自动装箱和自动拆箱
  5. Mr.J--学习五子棋的艰苦之路
  6. abap中读取excel中不同的sheet数据_Python 如何将数据写入Excel的不同或同一个工作簿中...
  7. php 与shell,[转]PHP与Shell交互
  8. 获取android手机基本信息
  9. shiro配置文件shiro.ini简介说明
  10. 纪念王盘声逝世一周年王派演唱会成功举行
  11. 解决联想电脑“未安装音频设备”问题
  12. 怎样成为时间管理的高手
  13. 使用adb命令安装apk
  14. 我的世界服务器怎么制作头颅,我的世界怎么刷生物头颅 我的世界生物头颅制作方法-游侠网...
  15. 【硬见小百科】SMT工艺,是什么影响锡膏印刷的质量
  16. 卫生洁具安装工艺标准
  17. 为什么说千万别用微软 IE 下载 Chrome?
  18. 小熊、九阳、苏泊尔,小家电玩家们乱了阵脚?
  19. 【数据分析】- 游戏业务常用指标
  20. 1527. 患某种疾病的患者(like关键字的使用)

热门文章

  1. maven工程拆分与聚合的思想
  2. MybatisPlus实现逻辑删除
  3. Logger对象父子关系
  4. 选择结构_单if语句
  5. 数据仓库分层和元数据管理
  6. 代理模式coding-动态代理
  7. Zookeeper_环境搭建及客户端使用
  8. 计算机的好处英语,跪求一篇英语作文 题目:论计算机的优缺点
  9. mysql linux-syn25000是什么_当MySQL数据库遇到Syn Flooding
  10. linux 基本指令