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)    收藏  举报

导航