#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f
int N, M, S, D;// N 城市个数, M 道路条数, S出发点, D 终点
int pre[1111];//储存到达i城市的上一个城市编号(该城市是到达i城市的最近且救援人数最多)
int num[1111];//到达该城市的最短路径条数
int peo[1111];//储存到达某一城市的 救援人数
int abpeo[1111];
int Gra[1111][1111];//图的存储
void Dijkstra()
{
int i;
int dis[1111];
for(i = 0;i < N;i++) dis[i] = Gra[S][i];//初始化距离
dis[S] = 0;
int book[1111];
memset(book, 0, sizeof(book));
book[S] = 1;
num[S] = 1;
for(i = 0;i < N;i++)num[i] = 1;
memset(pre, -1, sizeof(pre));//初始化为-1****表示前面没有城市
for(i = 0;i < N-1;i++)//dijkstra
{
int Min = INF;
int u = INF;//
int j;
for(j = 0;j < N;j++)
{
if(book[j] == 0&&dis[j] < Min)
{
Min = dis[j];
u = j;
}
}
book[u] = 1;
for(j = 0;j < N;j++)
{
if(dis[j] > dis[u]+Gra[u][j])
{
dis[j] = dis[u]+Gra[u][j];
pre[j] = u;
num[j] = num[u];
abpeo[j] = abpeo[u]+peo[j];
}
else if(dis[j] == dis[u]+ Gra[u][j])
{
num[j]+=num[u];
if(abpeo[j] < abpeo[u]+peo[j])
{
pre[j] = u;
abpeo[j] = abpeo[u]+peo[j];
}
}
}
}
}
int main ()
{
memset(Gra, INF, sizeof(Gra));//初始化图
int i;
scanf("%d %d %d %d", &N, &M, &S, &D);
for(i = 0;i < N;i++)
{
scanf("%d", &peo[i]);
abpeo[i] = peo[i];
}
for(i = 0;i < M;i++)
{
int s, d, w;
scanf("%d %d %d", &s, &d, &w);
Gra[s][d] = Gra[d][s] = w;
}
Dijkstra();
printf("%d %d\n", num[D], abpeo[D]+peo[S]);
int path[1111];
int j = 0;
int z = D;
while(pre[z]!= -1)
{
path[j++] = pre[z];
z= pre[z];
}
printf("%d", S);
for(i = j-1;i>= 0;i--) printf(" %d", path[i]);
printf(" %d", D);
return 0;
}
城市间紧急救援--Dijktra(待改善)
猜你喜欢
转载自blog.csdn.net/qq_43824791/article/details/88817821
今日推荐
周排行