当前位置: 首页 > article >正文

使用邻接矩阵实现有向图最短路径Dijkstra算法 题目编号:1136

题目描述

用邻接矩阵存储有向图,实现最短路径Dijkstra算法,图中边的权值为整型,顶点个数少于10个。

部分代码提示:
#include
#include
using namespace std;

const int MaxSize = 10;
const int INF = 32767;

class MGraph
{
public:
MGraph(char a[], int n, int e);

void Dijkstra();

private:
char vertex[MaxSize];
int arc[MaxSize][MaxSize];
int vertexNum, arcNum;
};

MGraph::MGraph(char a[], int n, int e)
{
//write your code.

}

int Min(int dist[], int vertexNum)
{
//write your code.

}
void MGraph::Dijkstra()
{
//write your code.

}

int main()
{
int n = 0;
int e = 0;
cin >> n >> e;
char p[MaxSize];
int i = 0;

for (i=0; i<n; i++)
{
	cin >> p[i];
}

MGraph MG(p, n, e);

MG.Dijkstra();

return 0;

}

输入描述

首先输入图中顶点个数和边的条数;
再输入顶点的信息(字符型);
再输入各边及其权值。

输出描述

依次输出从编号为0的顶点开始的从小到大的所有最短路径,每条路径及其长度占一行。

输入样例

5 7
A B C D E
0 1 6
0 2 2
0 3 1
1 2 4
1 3 3
2 4 6
3 4 7

输出样例

AD 1
AC 2
AB 6
ADE 8
内存阀值:50240K 耗时阀值:5000MS

代码

#include <iostream>
#include <string>
using namespace std;
 
const int MaxSize = 10;
const int INF = 32767;
 
class MGraph
{
public:
	MGraph(string a[], int n, int e);
 
	void Dijkstra();
 
private:
	string vertex[MaxSize];
	int arc[MaxSize][MaxSize];
	int vertexNum, arcNum;
};
 
MGraph::MGraph(string a[], int n, int e)
{
	//1、赋值
	vertexNum = n;
	arcNum = e;
	//2、顶点表
	for (int i = 0; i < vertexNum; i++)
		vertex[i] = a[i];
	//3、边表初始化
	for (int i = 0; i < vertexNum; i++)
		for (int j = 0; j < vertexNum; j++)
			arc[i][j] = INF;
	//4、边表赋值
	int i = 0, j = 0, w = 0;
	for (int k = 0; k < arcNum; k++)
	{
		cin >> i >> j >> w;
		arc[i][j] = w;
		//arc[j][i] = w;//有方向的不用反复设置相同!!!!掉坑了我淦!
	}
}
 
int Min(int dist[], int vertexNum)
{
	int min = INF;
	
	int pos = 0;
 
	for (int i = 0; i < vertexNum; i++)
	{
		if (dist[i] < min && dist[i] != 0)//!=0?:存入的顶点不需要遍历
		{
			min = dist[i];
 
			pos = i;
		}
	}
	return pos;
}
 
void MGraph::Dijkstra()
{
	int v = 0;
	int i, k, num, dist[MaxSize];//权值表
	string path[MaxSize];//路径表
	for (i = 0; i < vertexNum; i++)
	{
		dist[i] = arc[v][i];//v-表示当前顶点,i-表示这个顶点与其他顶点的边的权值(希望屏幕前的你能理解)
 
		if (dist[i] != INF)//如果连通
			path[i] = vertex[v] + vertex[i];
		else
			path[i] = "";
	}
 
	dist[0] = 0;
	
	for (num = 1; num < vertexNum; num++)//不知道为什么=1?顶点表已经在集合中了,所以不用遍历
	{
		k = Min(dist, vertexNum);
		
		cout << path[k] <<' ' << dist[k];
 
		for (i = 0; i < vertexNum; i++)//更新最小权值表
		{
			if (dist[i] > dist[k] + arc[k][i])
			{
				dist[i] = dist[k] + arc[k][i];
 
				path[i] = path[k] + vertex[i];
			}
		}
		dist[k] = 0;//将k加入集合,为什么是0?因为0比其他路径权值和都要小所以无法改变
	}
}
 
int main()
{
	int n = 0;
	int e = 0;
	cin >> n >> e;
	string p[MaxSize];
	int i = 0;
 
	for (i = 0; i < n; i++)
	{
		cin >> p[i];
	}
 
	MGraph MG(p, n, e);
 
	MG.Dijkstra();
 
	return 0;
}

http://www.kler.cn/a/16286.html

相关文章:

  • 基于Java Springboot快递物流管理系统
  • 数据结构Python版
  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • 卷积神经网络之Yolo详解
  • 云运维基础
  • Thread类及常见方法
  • 32岁阿里P7,把简历改成不知名小公司,学历改成普通本科,工作内容不变,投简历全挂!...
  • 什么是跨域?
  • 谈谈常用Reverse shell,以及他们是怎么做到的。
  • linux下的权限管理
  • gl-opendrive插件(车俩3D仿真模拟自动驾驶)
  • MATLAB | 如何使用MATLAB绘制高度自定义的桑基图(sankey)
  • 废物,我TMD一个985却斗不过专科生(大厂自动化测试2年被裁)
  • Java使用 Scanner连续输入int, String 异常错误输出原因分析
  • 轻叶H5营销单页,让你的营销更加清爽高效
  • 实训笔记1
  • 15-4-线程-线程同步之互斥量加锁解锁
  • matlab绘制折线图基本操作
  • 『python爬虫』04. 爬虫需要知道的HTTP协议知识(保姆级图文)
  • 云和恩墨荣获2023数字中国创新大赛·信创赛道“最具发展潜力奖”等4个奖项
  • C语言从入门到精通第16天(指针的定义与基本使用)
  • PID控制---基于python模拟
  • 面向画布(Canvas)的JavaScript库
  • 【c语言小项目】基于easyX的俄罗斯方块
  • Analysis For Office的一些使用技巧
  • C++练级之初级:第六篇