L2-001 紧急救援 (25 分) (Dijkstra应用)

题目链接

最开始这题没有写对,找了半天错误,以为Dijkstra函数写错了,最后发现没有将矩阵初始化为INF。。。真令人头大。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int N,M,S,D;
int mapp[510][510];     //邻接矩阵
int nums[510];          //节点消防员数目
int Dis[510];           //最短距离数组
bool used[510]={0};     //标志
int pre[510];           //前驱节点
int sum[510];           //走到节点i召集的消防员最大总数
int cnt[510];           //节点i同长路径数目
vector<int> path;
void dijkstra(int s)
{
    fill(Dis,Dis+N,INF);
    fill(used,used+N,false);
    fill(pre,pre+N,-1);
    Dis[s]=0;
    sum[s]=nums[s];
    cnt[s]=1;
    while(1)
    {
        int v=-1;
        //cout<<v<<endl;
        for(int u=0;u<N;u++)
        {
            if(!used[u]&&(v==-1||Dis[u]<Dis[v]))
                v=u;
        }
        if(v==-1)
            break;
        used[v]=true;
        for(int u=0;u<N;u++)
        {
            if(mapp[v][u]==INF)
                continue;
            if(Dis[u]>Dis[v]+mapp[v][u])
            {
                Dis[u]=Dis[v]+mapp[v][u];
                pre[u]=v;
                cnt[u]=cnt[v];
                sum[u]=sum[v]+nums[u];
            }
            else
            {
                if(Dis[u]==Dis[v]+mapp[v][u])
                {
                    cnt[u]+=cnt[v];
                    if(nums[u]+sum[v]>sum[u])
                    {
                        sum[u]=sum[v]+nums[u];
                        pre[u]=v;
                    }
                }
            }
        }
    }
    cout<<cnt[D]<<" "<<sum[D]<<endl;

    int k=D;
    while(k!=S)
    {
        path.push_back(k);
        k=pre[k];
    }
    path.push_back(k);
    reverse(path.begin(),path.end());
    for(int i=0;i<path.size();i++)
        {
            if(i!=0)
                printf(" ");
            printf("%d",path[i]);
        }
        cout<<endl;

}
int main()
{
    scanf("%d%d%d%d",&N,&M,&S,&D);
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
        mapp[i][j]=INF;
    for(int i=0;i<N;i++)
        scanf("%d",&nums[i]);
    for(int i=0;i<M;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        scanf("%d",&mapp[x][y]);
        mapp[y][x]=mapp[x][y];
    }

    dijkstra(S);
    return 0;
}

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/q1072118803/article/details/86364926
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞