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的主要内容,如果未能解决你的问题,请参考以下文章