#include<stdio.h>
# define peak 510
typedef struct{
int kilometer;
int cost;
}graph;
int visited[peak];
graph G[peak][peak];
int node ,edges ,begin ,end ;
void creatgraph()
{
scanf("%d %d %d %d",&node,&edges,&begin,&end);
for(int i = 0;i<node;i++)
{
visited[i] = 0;
}
visited[0] = 1;
for(int i = 0;i<node;i++)
{
for(int j= 0;j<node;j++)
{
if(i == j)
{
G[i][j].cost = 0;
G[i][j].kilometer = 0;
}
else
{
G[i][j].cost = 65535;
G[i][j].kilometer = 65535;
}
}
}
int row ,pow, kilometer1, cost1;
for(int i = 0;i<edges;i++)
{
scanf("%d %d %d %d",&row,&pow,&kilometer1,&cost1);
G[row][pow].kilometer = G[pow][row].kilometer = kilometer1;
G[row][pow].cost = G[pow][row].cost = cost1;
}
}
void redijstra()
{
int min ,mincost;
for(int i = 0;i<node;i++)
{
min = mincost = 65535;
int temp = 0;
//第一部分找
for(int j = 0;j<node;j++)
{
if(!visited[j]&&G[begin][j].kilometer<min)
{
temp = j;
min = G[begin][j].kilometer;
mincost = G[begin][j].cost;
}
else if(!visited[j]&&G[begin][j].kilometer==min)
{
if(G[begin][j].cost<mincost)
{
temp = j;
min = G[begin][j].kilometer;
mincost = G[begin][j].cost;
}
}
}
visited[temp] = 1;
//第二部分改
for(int w = 0;w<node;w++)
{
if(min+G[temp][w].kilometer<G[begin][w].kilometer)
{
G[begin][w].kilometer = min+G[temp][w].kilometer;
G[begin][w].cost = mincost+G[temp][w].cost;
}
else if(min+G[temp][w].kilometer==G[begin][w].kilometer)
if(G[begin][w].cost > mincost+G[temp][w].cost)
{
G[begin][w].kilometer = min+G[temp][w].kilometer;
G[begin][w].cost = mincost+G[temp][w].cost;
}
}
}
printf("%d %d",G[begin][end].kilometer,G[begin][end].cost);
}
int main()
{
creatgraph();
redijstra();
return 0;
}//非常简洁 鼓鼓掌
该算法核心只有两个过程,第一部分是查找,第二部分是更改,同时不断遍历每个点,确定的点要visited初始化为0,注意第一个点默认为1
另外第一部分和第二部分的衔接,注意引入temp,开始用j,j不断向前,实为刻舟求剑。