成都信息工程大学天梯赛 L2-2 不要刁难我们了
赛时板子没写对,原因就是标记数组的位置放错了,放到了while外面,导致这样距离数组是不会更新的,板子还是要自己多写少看
#include <bits/stdc++.h>
#define int long long
using namespace std;
using pii = pair<int, int>;
using psc = pair<string, char>;
int n,m;
int st,ed;
int mes[200005];
int road[200005];
struct node{
int v;
int w;
};
vector<node>basis[200005];
int dis[200005];
int vis[200005];
void dijkstra(int x)
{
for(int i=1;i<=n;i++) dis[i]=1e9;
priority_queue<pii>q;
q.push({0,x});
dis[x]=0;
road[x]=1;
while(q.size()){
auto [ds,now]=q.top();
q.pop();
if(vis[now]) continue;//标记数组应放在这里而不是外面
vis[now]=1;
for(auto [v,w]:basis[now]){
if(dis[v]>dis[now]+w)
{
dis[v]=dis[now]+w;
road[v]=road[now];//注意这个路径数量的更新
q.push({-dis[v],v});
}else if(dis[v]==dis[now]+w){
road[v]+=road[now];//注意这个
//这里不要在放到队列里 否则路径会变多
}
}
}
}
void solve() {
cin>>n>>m;
cin>>st>>ed;
for(int i=1;i<=n;i++) cin>>mes[i];
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
basis[u].push_back({v,w+mes[v]});//直接这里加进去就可以 省的每次还要加
basis[v].push_back({u,w+mes[u]});
}
dijkstra(st);
cout<<dis[ed]<<"\n"<<road[ed];
}
signed main() {
int t = 1;
ios::sync_with_stdio(0), cin.tie(0);
// cin>>t;
while (t--) solve();
return 0;
}
posted on 2025-03-20 21:48 swj2529411658 阅读(29) 评论(0) 收藏 举报
浙公网安备 33010602011771号