城市间紧急救援--Dijktra(1.1版)

#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()
{
    memset(pre, -1, sizeof(pre));//初始化为-1****表示前面没有城市

    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;

    /*********初始化S所能达到的城市(直接达到) 路径都为1*****/
    for(i = 0;i < N;i++)
    {
        if(Gra[S][i]!= INF) num[i] = 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;
}



相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-13
  • 2021-10-16
  • 2021-10-24
  • 2022-01-16
  • 2021-09-07
  • 2021-11-29
相关资源
相似解决方案