1003 Emergency (25 分)难度: 中等 / 知识点: 变种的Dijkstra

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1003 Emergency (25 分)难度: 中等 / 知识点: 变种的Dijkstra相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int dist[N],cnt[N],sum[N],st[N],n,m;
int g[N][N],w[N],startx,endx;
// cnt[j] 存的是j到起点的最短路的数量。
// sum[j] 存的是j到起点的最短路上最大的人数
void Dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    dist[startx]=0,cnt[startx]=1,sum[startx]=w[startx];
    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=0;j<n;j++) if(!st[j]&&(t==-1|| dist[j]<dist[t])) t=j;
        st[t]=1;
        for(int j=0;j<n;j++)
        {
            if(dist[j]>dist[t]+g[t][j])
            {
                dist[j]=dist[t]+g[t][j];
                cnt[j]=cnt[t];
                sum[j]=sum[t]+w[j];
            }
            else if(dist[j]==dist[t]+g[t][j])//相等了
            {
                cnt[j]+=cnt[t];
                sum[j]=max(sum[j],sum[t]+w[j]);
            }
        }
    }
}
int main(void)
{
    memset(g,0x3f,sizeof g);
    cin>>n>>m>>startx>>endx;
    for(int i=0;i<n;i++) cin>>w[i];
    while(m--)
    {
        int a,b,c; cin>>a>>b>>c;
        g[a][b]=g[b][a]=min(g[a][b],c);
    }
    Dijkstra();
    cout<<cnt[endx]<<" "<<sum[endx]<<endl;
    return 0;
}

以上是关于1003 Emergency (25 分)难度: 中等 / 知识点: 变种的Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

1003 Emergency (25 分)

PAT甲级1003 Emergency (25分)

1003 Emergency(25 分)

PAT Advanced 1003 Emergency (25分)

A1003 Emergency (25分)

甲级1003 Emergency