题意:
解法:
发现n只有2000,
设dist[i][j]=x表示有一条点i到点j,边权为x的路径,如果有重边则取min.
枚举st,计算st到其他点的单源最短路d[i],那么ans[st]=min{d[i]+dist[i][st]}.
设n,m同阶,同复杂度大概是O(n^2 *log)
code:
#include<bits/stdc++.h>
typedef long long ll;
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e3+5;
vector<PI>g[maxm];
int dist[maxm][maxm];
int mark[maxm];
int ans[maxm];
int d[maxm];
int n,m;
void spfa(int st){
for(int i=1;i<=n;i++){
d[i]=1e18;
mark[i]=0;
}
d[st]=0;
mark[st]=1;
queue<int>q;
q.push(st);
while(q.size()){
int x=q.front();q.pop();
mark[x]=0;
for(auto i:g[x]){
int v=i.first,w=i.second;
if(d[v]>d[x]+w){
d[v]=d[x]+w;
if(!mark[v]){
mark[v]=1;
q.push(v);
}
}
}
}
for(int i=1;i<=n;i++){
ans[st]=min(ans[st],d[i]+dist[i][st]);
}
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j]=1e18;
}
}
for(int i=1;i<=n;i++){
ans[i]=1e18;
}
for(int i=1;i<=m;i++){
int a,b,c;cin>>a>>b>>c;
g[a].push_back({b,c});
dist[a][b]=min(dist[a][b],c);
}
for(int i=1;i<=n;i++){
spfa(i);
}
for(int i=1;i<=n;i++){
if(ans[i]==1e18)ans[i]=-1;
cout<<ans[i]<<endl;
}
return 0;
}