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

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

模型压缩综述

https://www.cnblogs.com/shixiangwan/p/9015010.html

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo