SGU 206 Roads KM算法 匹配模型的转化

2023-11-08 08:58

本文主要是介绍SGU 206 Roads KM算法 匹配模型的转化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是一道非常好的题目

题目大意:

给了一个图,n个点,m条边,其中前n-1条边保证是生成树,现在你可以修改每条边的边权,花费为修改量,然后用最小的花费修改使得前n-1条边为最小生成树

这题乍一看无从下手

实际上可以这么分析

边可以分为两类,一种是前n-1条边,构成了一个生成树,其他的边是另外一种边

显然如果我们要达到最小生成树的目的,就要让生成树上的边变小,而另外的边变大

从第n条边到第m条边,每条边如果加入那个生成树中,必然会构成了一个环,而我们不想让这条边去替换环中的任意一条边,所以这条边必须比任意环中的边要大。

假设环中的某边为i,这条边为j, 权值分为w[i], w[j] ,修改后的权值为 w[i] - x[i] , w[j] + x[j] 必然有 w[i] - x[i] <= w[j] + x[j]  从而有 x[i] + x[j] >= w[i] - w[j] 

然后目的是sum(x[i]) 1 <= i <= m   最小         

观察x[i] + x[j] >= w[i] - w[j] 这个不等式和我们的目的,是否发现跟KM算法有相像之处?

因为由可行点标的的定义,图中的任意一个完全匹配,其边权总和均不大于所有点的标号之和,而仅由可行边组成的完全匹配的边权总和等于所有点的标号之和

而我们在寻找可行边的过程,每条边从不是可行边到变为可行边,会使边两端的可行顶标之和减小,最后到达最大权匹配时就是顶标和最小的时候。

这道题又像我们传达了一个算法活用的思想。

往往根据几个式子,就可以转化为某个模型。这也是建立在对算法的深刻理解上吧、

注意:如果两边点数不知谁大谁小,点数少的那一方补齐点,补的点跟另一方的点的边权都为0,KM是先保证的最大匹配数,再保证的最大权

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define eps 1e-5
#define MAXN 405
#define MAXM 405
#define INF 100000007
using namespace std;
int n, m, ny, nx;
int w[MAXN][MAXM];
int lx[MAXN], ly[MAXM];
int linky[MAXM];
int visx[MAXN], visy[MAXM];
int slack[MAXM];
bool find(int x)
{visx[x] = 1;for(int y = 1; y <= ny; y++){if(visy[y]) continue;int t = lx[x] + ly[y] - w[x][y];if(t == 0){visy[y] = 1;if(linky[y] == -1 || find(linky[y])){linky[y] = x;return true;}}else if(slack[y] > t) slack[y] = t;}return false;
}
int KM()
{memset(linky, -1, sizeof(linky));for(int i = 1; i <= nx; i++) lx[i] = -INF;memset(ly, 0, sizeof(ly));for(int i = 1; i <= nx; i++)for(int j = 1; j <= ny; j++)if(w[i][j] > lx[i]) lx[i] = w[i][j];for(int x = 1; x <= nx; x++){for(int i = 1; i <= ny; i++) slack[i] = INF;while(true){memset(visx, 0, sizeof(visx));memset(visy, 0, sizeof(visy));if(find(x)) break;int d = INF;for(int i = 1; i <= ny; i++)if(!visy[i]) d = min(d, slack[i]);if(d == INF) return -1;for(int i = 1; i <= nx; i++)if(visx[i]) lx[i] -=d;for(int i = 1; i <= ny; i++)if(visy[i]) ly[i] += d;else slack[i] -= d;}}return 1;
}
int x[MAXN], y[MAXN], z[MAXN];
int g[MAXN][MAXN];
int dfs(int pre, int u, int v, int id)
{if(u == v) return 1;for(int i = 1; i <= n; i++){if(pre == i || !g[u][i]) continue;if(dfs(u, i, v, id)){w[g[u][i]][id] = z[g[u][i]] - z[id];return 1;}}return 0;
}
int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= m; i++) scanf("%d%d%d", &x[i], &y[i], &z[i]);for(int i = 1; i <= n - 1; i++) g[x[i]][y[i]] = g[y[i]][x[i]] = i;for(int i = 1; i <= m; i++)for(int j = 1; j <= m; j++)w[i][j] = 0;nx = ny = m;for(int i = n; i <= m; i++)dfs(0, x[i], y[i], i);KM();for(int i = 1; i < n; i++) printf("%d\n", z[i] - lx[i]);for(int i = n; i <= m; i++) printf("%d\n", z[i] + ly[i]);return 0;
}



这篇关于SGU 206 Roads KM算法 匹配模型的转化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

关于Gateway路由匹配规则解读

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

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe