【算法】贪心算法-最短路径

  • Description

    • 给出一个有向图(无负权值),求任意两点间的最短路径

  • Input

    • 第一行为有向图中点的数量n(各点从0到n-1编号)第二行为边的数量m第三行为要求其间最短路径的两个点第四行起为m条边的信息,包括起点、终点和路径长度(保证长度是整数,且绝对值不大于100),以空格隔开

8

15

0 5

4 5 35

5 4 35

4 7 37

5 7 28

7 5 28

5 1 32

0 4 38

0 2 26

7 3 39

1 3 29

2 7 34

6 2 40

3 6 52

6 0 58

6 4 93
  • Output

    • 求出输入中第三行两个点之间的最短路径长度并输出,比如上面的输入例子中,点0到点5间最短路径长度为73,则输出为:73

73
  • 代码部分:

#include <stdio.h>
#include <string.h> 
#include <stdbool.h>

#define maxnum 100000
#define arraynum 1000

int n,m,s,e;// 节点个数,边数,起始点,结束点 
int ifvisit[arraynum];
int map[arraynum][arraynum];
int distance[arraynum];

int findmin(){
	int temp = maxnum;
	int vode = -1; 
	for(int i=0;i<n;i++){
		if(ifvisit[i]==0){
			if(distance[i]<temp){
				temp = distance[i];
				vode = i;
			}
		}
	}
	return vode;
}

int Dijkstra(){
	ifvisit[s] = 1;
	distance[s] = map[s][s];
	for(int j=0;j<n;j++){
		if(map[s][j]>0){
			distance[j] = map[s][j] + distance[s];
		}
	}
	for(int i=1;i<n;i++){
		int minb = findmin();
		ifvisit[minb] = 1;
		if(minb == e){
			return distance[e];
		}
		for(int j=0;j<n;j++){
			if(map[minb][j]>0 && ifvisit[j]==0){
				if(map[minb][j] + distance[minb]<distance[j]){
					distance[j] = map[minb][j] + distance[minb];
				}
			}
		}	
	}
	return distance[e];
}

int main(){
	for (int i = 0; i < maxnum; ++i) { 
		distance[i] = maxnum; // 将数组的每个元素初始化为2 
	}
	scanf("%d",&n);
	scanf("%d",&m);
	scanf("%d",&s);
	scanf("%d",&e);
	for(int k=0;k<m;k++){
		int i,j;
		scanf("%d",&i);
		scanf("%d",&j);
		scanf("%d",&map[i][j]);
	}
	printf("%d",Dijkstra());
	return 0;
} 
须注意在使用Dijkstra算法找到目标节点后可执行return操作剪枝,同时最大数值数量须不低于100000以保证oj运行通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值