1003-Emergency
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376
解题思路
典型的Dijkstra模板题。
总结
对于一些经典算法,尝试去多理解,多模拟过程;只去背模板的话,很容易忘或者说出现一些细节错误!
代码展示
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
/*
Dijkstra算法
附件条件 最短路径个数 + 经过的城市救援队数量之和
5 6 0 2
1 2 1 5 3
0 1 3
0 3 4
0 4 5
1 2 6
3 2 7
4 2 8
*/
int w[505];
int G[505][505];
int dis[505];
bool vis[505];
int n;
int num[505];//从s到 i 的最短路径个数
int val[505];
void Dijkstra(int s){
fill(dis,dis+505,inf);
dis[s]=0;num[s]=1;val[s]=w[s];
for(int i=0;i<n;i++){
int u=-1,minn=inf;
for(int j=0;j<n;j++){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
u=j;
}
}
//得到距离s最近的未访问的可达城市
if(u==-1)return;
vis[u]=1;
for(int j=0;j<n;j++){
if(G[u][j]!=inf&&!vis[j]){
if(dis[u]+G[u][j]<dis[j]){
dis[j]=dis[u]+G[u][j];
num[j]=num[u];
val[j]=val[u]+w[j];
}
else if(dis[u]+G[u][j]==dis[j]){
num[j]+=num[u];
val[j]=max(val[j],val[u]+w[j]);
}
}
}
}
}
int main(){
fill(G[0],G[0]+505*505,inf);
int m,c1,c2;
cin>>n>>m>>c1>>c2;
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]=c;
}
Dijkstra(c1);
cout<<num[c2]<<" "<<val[c2]<<endl;
return 0;
}
1379

被折叠的 条评论
为什么被折叠?



