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

目录

题目:

思路:

代码:

结果

题目:

思路:

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

代码:

cpp 复制代码
#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;
}

结果:

相关推荐
程序员编程指南25 分钟前
Qt 与 WebService 交互开发
c语言·开发语言·c++·qt·交互
荼蘼28 分钟前
基于 KNN 算法的手写数字识别项目实践
人工智能·算法·机器学习
溟洵33 分钟前
Qt 窗口 工具栏QToolBar、状态栏StatusBar
开发语言·前端·数据库·c++·后端·qt
Yuroo zhou1 小时前
IMU的精度对无人机姿态控制意味着什么?
单片机·嵌入式硬件·算法·无人机·嵌入式实时数据库
铭哥的编程日记1 小时前
《C++ list 完全指南:list的模拟实现》
c++
程序员编程指南1 小时前
Qt 远程过程调用(RPC)实现方案
c语言·c++·qt·rpc·系统架构
jackzhuoa1 小时前
java小白闯关记第一天(两个数相加)
java·算法·蓝桥杯·期末
Codeking__2 小时前
链表算法综合——重排链表
网络·算法·链表
minji...3 小时前
数据结构 堆(4)---TOP-K问题
java·数据结构·算法
十间fish3 小时前
STL温故知新
c++