#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const ll inf=1e16;
#define N 1000005
int n,m;
struct edge{int v,w;};
vector<edge> e[N];
int vis[N],cnt[N];
int h[N],d[N];
void spfa(){
queue<int>q;
for(int i=1;i<=n;i++) h[i]=inf;
for(int i=1;i<=n;i++) cnt[i]=vis[i]=0;
h[0]=0,vis[0]=1;q.push(0);
while(q.size()){
int u=q.front(); q.pop();vis[u]=0;
for(auto ed : e[u]){
int v=ed.v,w=ed.w;
if(h[v]>h[u]+w){
h[v]=h[u]+w;
cnt[v]=cnt[u]+1;
if(cnt[v]>n){
printf("-1\n");exit(0);
}
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
}
void dijkstra(int s){
priority_queue<pair<int,int>>q;
for(int i=1;i<=n;i++) d[i]=inf;
for(int i=1;i<=n;i++) vis[i]=0;
d[s]=0; q.push({0,s});
while(q.size()){
int u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto ed:e[u]){
int v=ed.v,w=ed.w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!vis[v]) q.push({-d[v],v});
}
}
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) e[i].clear();
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
e[u].push_back({v,w});
e[v].push_back({u,w});
}
vector<int>t(n+1);
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=1;i<=n;i++){
e[0].push_back({i,0});//加虚拟边
}
spfa();
for(int u=1;u<=n;u++)
for(auto &ed:e[u])
ed.w+=h[u]-h[ed.v];//构造新边
//f[i][j]表示i->j的最短路
vector<vector<int>>f(n+1,vector<int>(n+1));
for(int i=1;i<=n;i++){
dijkstra(i);
for(int j=1;j<=n;j++){
f[i][j]=d[j]+h[j]-h[i];
}
}
//以上都是johnson板子
vector<int>mnd(n+1,inf);
auto bfs=[&](int s){
for(int i=1;i<=n;i++) vis[i]=0;
priority_queue<pair<int,int>>pq;
pq.push({0,s});mnd[s]=0;
while(pq.size()){
int u=pq.top().second;pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(int v=1;v<=n;v++){
if(vis[v]) continue;
if(mnd[u]+f[u][v]*t[u]<mnd[v]){
mnd[v]=mnd[u]+f[u][v]*t[u];
pq.push({-mnd[v],v});
}
}
}
};
bfs(1);
cout<<mnd[n]<<'\n';
}
全源最短路johnson板子
最新推荐文章于 2024-08-02 04:21:55 发布