L2-001 紧急救援
同样的在最短路的模版上添加了一些量的存储,和最终路径的存储
#include <bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using psc=pair<string,char>;
int n,m,s,d;
struct node{
int v;
int w;
};
vector<node>ve[505];
bool vis[505];
int num[505];//每个城镇的消防员数量
int dis[505];
int ans[505];//最终每个点的火警人员
int road[505];//最短路径数量
int lj[505];//路径
void djkstra(int x)
{
priority_queue<pii>q;
for(int i=0;i<=n;i++) dis[i]=1e9,lj[i]=-1;
dis[x]=0;
q.push({-dis[x],x});
ans[x]=num[x];
road[x]=1;
while(q.size()){
auto [ds,now]=q.top();//记得距离取出来是负数 用的时候要取相反值
q.pop();
if(vis[now]) continue;//标记记得放这里
vis[now]=1;
for(auto [v,w]:ve[now])
{
if(dis[now]+w<dis[v]){
dis[v]=dis[now]+w;
q.push({-dis[v],v});
ans[v]=ans[now]+num[v];//更新消防员数量
road[v]=road[now];//更新路径数量
lj[v]=now;//路径要反着存 最后从终点跑到起点
}else if(dis[now]+w==dis[v]){
if(ans[v]<ans[now]+num[v]){//距离相同 的话,如果火警人数可以更多则优先考虑这条路
road[v]+=road[now];
q.push({-dis[v],v});
ans[v]=ans[now]+num[v];
lj[v]=now;
}
}
}
}
}
void solve()
{
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++) cin>>num[i];
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
ve[u].push_back({v,w});
ve[v].push_back({u,w});
}
djkstra(s);
cout<<road[d]<<" "<<ans[d]<<"\n";
int t=lj[d];
stack<int>st;
while(t!=-1){
st.push(t);
t=lj[t];
}
while(st.size()){
cout<<st.top()<<" ";
st.pop();
}
cout<<d;
}
signed main()
{
int t=1;
ios::sync_with_stdio(0),cin.tie(0);
// cin>>t;
while(t--) solve();
return 0;
}
posted on 2025-03-26 20:59 swj2529411658 阅读(15) 评论(0) 收藏 举报
浙公网安备 33010602011771号