SHAOXIAOJ正在加载中...

2627: 贪心算法-单源最短路径

金币值:3 定数:9 时间限制:1.000 s 内存限制:128 M
正确:3 提交:3 正确率:100.00% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 算法设计

题目描述

已知一个加权有向图,给出图中从某个顶点到其它各个顶点的最短路径。要求存储结构用邻接矩阵,应用迪杰斯特拉方法设计算法。

测试代码   复制

#include<stdio.h>
#define MAXVEX 100 // 最大顶点数由用户定义
#define INFINITY  65535

typedef char VertexType; // 顶点类型应由用户定义
typedef int EdgeType; // 边上的权值类型应由用户定义

typedef struct {
	VertexType vexs[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numNodes;
	int numEdges;
} MGraph;

int label[MAXVEX]; // 存储从源点出发到其余各个顶点的最短路径上的最后一个顶点编号
int distance[MAXVEX]; // 存储从源点出发到其余各个顶点的最短距离

void CreateGraph(MGraph &G) {
	int i,j,u,v,w;
	for(i=0; i<G.numNodes; i++) // 初始化邻接矩阵
		for(j=0; j<G.numNodes; j++) G.arc[i][j] = INFINITY;
	for(i=0; i<G.numEdges; i++) { // 输入边信息填写有向图的邻接矩阵
		scanf("%d %d %d",&u,&v,&w);  // 边的信息包括顶点1,顶点2以及它们之间的距离
		G.arc[u][v]=w;
	}
}

void Dijkstra(MGraph G, int v) { //求从顶点v出发到其它各顶点的最短距离

	int i,j,found[MAXVEX]= {0}; // found[i]表示编号为i的顶点是否已经找到最短路径,1表示找到,0表示没有找到    
    found[v]=1;
	for(j=0; j<G.numNodes; j++) {// 建立初始待定路径表,设置父顶点的编号
		distance[j]=G.arc[v][j];
		label[j]=v;
	}
	for(i=1; i<G.numNodes; i++) {
		int min = INFINITY; // 查找从顶点v出发到“剩余”顶点的最短距离
		int index;
		for(j=0; j<G.numNodes; j++){
				
				
		}
		found[index]=1; // 设置编号为index的顶点已经找到最短路径
		for(j=0; j<G.numNodes; j++){ //更新待定路径表以及父顶点的编号 ) 
				
		}
	}
}

void Output(MGraph G, int v) {
	int n=G.numNodes;
	for(int i=0; i<n; i++) { //按照指定格式输出从源点v到其余各点的最短距离及其路径
		if(i!=v) {
			printf("v%d-v%d:%d[v%d",v,i,distance[i],i);
			for(int u=i; u!=v; u=label[u]) printf("<-v%d",label[u]);
			printf("]\n");
		}
	}
}

int main(void) {
	MGraph graph;
	scanf("%d %d",&graph.numNodes,&graph.numEdges);
	CreateGraph(graph); //存储结构是邻接矩阵
	Dijkstra(graph, 0); //求从顶点0出发到其余各个顶点的最短距离及其路径
	Output(graph, 0); //打印从顶点0出发到其余各个顶点的最短距离及其路径
	return 0;
}

输入格式

第1行输入2个整数,分别表示图中的顶点数n和边数m
第2-m+1行每行输入3个整数,分别表示图中每条有向边的起点i,终点j和权值weight(顶点编号从0开始)

输出格式

共有n-1行,每行前3个数据分别表示图中源点编号(假设编号为0的顶点是图中的源点)、其它顶点编号以及这两个顶点之间的路径长度,后面的数据表示这条路径上的顶点编号(从终点编号出发到源点编号结束)。
提示: v0-v2:4[v2<-v1<-v0]表示v0到v2的最短距离为4,[]内输出的是最短路径,即v0通过v1到达v2

输入样例    复制

4 4
0 1 10
0 2 30
1 3 20
2 3 40

输出样例    复制

v0-v1:10[v1<-v0]
v0-v2:30[v2<-v0]
v0-v3:30[v3<-v1<-v0]