-
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运行通过