城市间紧急救援--Dijktra(待改善)

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_43824791/article/details/88817821