畅通工程之局部最小花费问题 (C++)

news/2024/7/15 19:16:41 标签: c++, 图论, 算法

目录

题目: 

思路:

代码:

 结果

题目: 

思路:

详细思路都在代码注释里 。

代码:

#include<iostream>//无向图邻接矩阵
#include<map>
#include<algorithm>
#define mvnum 1005
using namespace std;
typedef int Vertextype;//顶点数据类型
map<Vertextype, int> mp;
typedef struct
{
	int data;
	int build;
}Arctype;//边权值类型
typedef struct
{
	Vertextype vexs[mvnum];//顶点表
	Arctype arcs[mvnum][mvnum];//邻接矩阵
	int vexnum, arcnum;//当前图的点数和边数
}AMGraph;
typedef struct
{
	Vertextype head;//始点
	Vertextype tail;//终点
	int w;//权值
	int build;
}edge;//边
int v[mvnum];//辅助数组,记录连通分支
edge e[50000];
bool Creategraph(AMGraph& G)
{
	cin >> G.vexnum;//输入总顶点数
	G.arcnum = G.vexnum * (G.vexnum - 1) / 2;//总边数
	for (int i = 1; i <= G.vexnum; i++)//初始化邻接矩阵
		for (int j = 1; j <= G.vexnum; j++)
			G.arcs[i][j].data = 0;
	for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
	{
		Vertextype v1, v2;
		int w, d;
		int t = 0;
		cin >> v1 >> v2 >> w >> d;//输入一条边的顶点及边的权值
		int i = v1;
		int j = v2;//确定v1和v2在G中的位置
		if (d == 1)//已经建造
			G.arcs[i][j].data = 0;//即不用再花钱
		else
			G.arcs[i][j].data = w;//边<v1,v2>的权值置为w
		G.arcs[i][j].build = d;//是否建造
		G.arcs[j][i] = G.arcs[i][j];//无向图是对称图
		e[k].head = i, e[k].tail = j, e[k].w = G.arcs[i][j].data, e[k].build = d;
	}
	return 1;
}
/*void Print(AMGraph G)
{
	cout << "邻接矩阵:" << endl;
	for (int i = 1; i <= G.vexnum; i++)
	{
		for (int j = 1; j <= G.vexnum; j++)
			cout << G.arcs[i][j].data << " ";
		cout << endl;
	}
}*/
bool cmp(edge a, edge b)
{
	if (a.w == b.w)
		return a.build > b.build;
	return a.w < b.w;
}
int Klsk(AMGraph& G)
{
	int sum = 0;
	//cout << "边:" << endl;
	sort(e, e + G.arcnum, cmp);
	for (int i = 1; i <= G.vexnum; i++)
		v[i] = i;//自成连通分量
	for (int i = 0; i < G.arcnum; i++)
	{
		int v1 = e[i].head;//取其位置
		int v2 = e[i].tail;//取其位置
		int vs1 = v[v1];//取其连通分量
		int vs2 = v[v2];//取其连通分量
		if (vs1 != vs2)//不为同一连通分量且建造通路
		{
				sum += e[i].w;
			//cout << e[i].head << " " << e[i].tail << " " << e[i].w << endl;
			for (int j = 1; j <= G.vexnum; j++)
				if (v[j] == vs2)//更新连通分量
					v[j] = vs1;
		}
	}
	return sum;
}
int main()
{
	AMGraph G;
	Creategraph(G);
	//Print(G);
	int ans = Klsk(G);
	cout << ans << endl;
}

 结果:


http://www.niftyadmin.cn/n/5171379.html

相关文章

算法必刷系列之滑动窗口

滑动窗口 滑动窗口的问题一般分为两类&#xff0c;一类是窗口大小固定&#xff0c;求解窗口内数据的最值问题&#xff0c;一类是窗口大小可变&#xff0c;求解窗口长度的最值问题。核心思想是使用快慢型双指针模拟滑动窗口&#xff0c;利用指针的移动模拟窗口的滑动&#xff0…

快速排序实现方法(剑指offer思路)

快速排序思想 从参与排序的数组中&#xff0c;选择一个数&#xff0c;把小于这个数的放在左边&#xff0c;大于这个数的放在右边&#xff0c;然后递归操作。 实现算法思路 选择最后一个当作参考值&#xff0c;使用small索引当作比这个数小的下标值遍历数组&#xff0c;如果小…

Vue3-组合式API下的父传子和子传父

组合式API下的父传子 基本思想&#xff1a; 1.父组件中给子组件绑定组件 2.子组件内部通过props选项接收 const propsdefineProps({属性名:类型}) 由于script上写了setup&#xff0c;所以无法直接配置props选项&#xff0c;所以需要借助于“编译器宏”函数接收传递的数据 …

【华为OD机试AB高分必刷题目】简单的最短路径(Java-Dijkstra算法实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试AB必刷题目】简单的最短路径(Java实现)题目描述解题思路Java题解代码代码OJ评判结果代码讲解寄语【华为OD机试AB必刷题目】简单…

优雅关闭TCP的函数shutdown效果展示

《TCP关闭的两种方法概述》里边理论基础&#xff0c;下边是列出代码&#xff0c;并且进行实验。 服务端代码graceserver.c的内容如下&#xff1a; #include "lib/common.h"static int count;static void sig_int(int signo) {printf("\nreceived %d datagrams\…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息&#xff0c;这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题&#xff1a; 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

BMVC 23丨多模态CLIP:用于3D场景问答任务的对比视觉语言预训练

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2306.02329 摘要&#xff1a; 训练模型将常识性语言知识和视觉概念从 2D 图像应用到 3D 场景理解是研究人员最近才开始探索的一个有前景的方向。然而&#xff0c…

find和grep命令的简单使用

find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径&#xff0c;可以是一个目录或文件名…