hdu - 3488 - Tour(二分图最佳完美匹配)

2023-11-03 12:58

本文主要是介绍hdu - 3488 - Tour(二分图最佳完美匹配),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:N个点,M条边的有向图,边有正权,求使每个点至少属于一个环的路径的最小权和(2 <= N <= 200,M <= 30000,0 < 每个边权W <= 10000)。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488

——>>好题~拆点的二分图最佳完美匹配。

对于每一个顶点u,将其拆成u1和u2,若原来有一条边为u——>v,则变成u2——>v1,以xx2为X结点,xx1为Y结点,边权的相反数为权值(我们要求最小权和,二分图最佳完美匹配KM求的是最大权和,所以取边权的相反数作为权值,即可直接调用KM),跑一次KM,根据fa[](即选出来的路径)输出就好。不确定是否有重边的情况,为保险,插入权值时加个比较~偷笑

#include <cstdio>
#include <algorithm>using namespace std;const int maxn = 200 + 10;
const int INF = 0x3f3f3f3f;int N, M, w[maxn][maxn], lx[maxn], ly[maxn], fa[maxn];
bool S[maxn], T[maxn];bool match(int i){S[i] = 1;for(int j = 1; j <= N; j++) if(lx[i] + ly[j] == w[i][j] && !T[j]){T[j] = 1;if(!fa[j] || match(fa[j])){fa[j] = i;return 1;}}return 0;
}void update(){int a = INF;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;}
}void KM(){for(int i = 1; i <= N; i++) fa[i] = lx[i] = ly[i] = 0;for(int i = 1; i <= N; i++)while(1){for(int j = 1; j <= N; j++) S[j] = T[j] = 0;if(match(i)) break;else update();}
}void read(){int U, V, W;scanf("%d%d", &N, &M);for(int i = 1; i <= N; i++)for(int j = 1; j <= N; j++) w[i][j] = -INF;for(int i = 1; i <= M; i++){scanf("%d%d%d", &U, &V, &W);w[U][V] = max(w[U][V], -W);}
}void solve(){int sum = 0;for(int i = 1; i <= N; i++) sum += w[fa[i]][i];printf("%d\n", -sum);
}int main()
{int C;scanf("%d", &C);while(C--){read();KM();solve();}return 0;
}


这篇关于hdu - 3488 - Tour(二分图最佳完美匹配)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338315

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO