floyd复杂度为O(p^3),题目中p<=800,不会TLE,甚至不用优化,为什么题解区里都是spfa和dij?
floyd AC代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
const int e=1e3+10;
int n,p,c,ans=INF;
int a[e];
int mp[e][e];
signed main(){
ios::sync_with_stdio(0);
cout.tie(0);cin.tie(0);
memset(mp,0x3f,sizeof mp);
for(int i=1;i<e;i++)
mp[i][i]=0;
cin>>n>>p>>c;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=c;i++){
int u,v,w;
cin>>u>>v>>w;
mp[u][v]=mp[v][u]=min(mp[u][v],w);
}
for(int k=1;k<=p;k++)
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
for(int i=1;i<=p;i++){
int cnt=0,flag=1;
for(int j=1;j<=n;j++){
if(mp[i][a[j]]!=INF)
cnt+=mp[i][a[j]];
else flag=0;
}
if(flag&&cnt>=0)
ans=min(ans,cnt);
}
cout<<ans<<'\n';
return 0;
}