蒟蒻不会 Floyd,跑了 n 遍 dijkstra,但是只拿了 40 分,剩余全 WA。有大佬帮忙看看什么回事吗?
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll INF = 9223372036854775807;
const int N = 100 + 10;
struct node{ll u, v, w;};
vector<node> g[N];
ll n, p, x, ans = INF, bao[N], d[N][N], visit[N];
priority_queue<pair<ll, ll> > q;
void dijkstra(int s){
memset(visit, 0, sizeof(visit));
d[s][s] = 0;
q.push(make_pair(0, s));
while(!q.empty()){
ll u = q.top().second;
q.pop();
if(visit[u]) continue;
visit[u] = 1;
for(int i=0;i<g[u].size();i++){
ll v = g[u][i].v;
ll w = g[u][i].w;
if(d[s][u] + w < d[s][v]){
d[s][v] = d[s][u] + w;
q.push(make_pair(-d[s][v], v));
}
}
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j] = INF;
cin >> x;
if(i == j) continue;
g[i].push_back((node){i, j, x});
}
}
for(int i=1;i<=n;i++) dijkstra(i);
cin >> p;
for(int i=1;i<=p;i++) cin >> bao[i];
do{
ll sum = 0;
sum += d[1][bao[1]] + d[bao[p]][n];
for(int i=1;i<p;i++) sum += d[bao[i]][bao[i + 1]];
ans = min(ans, sum);
}while(next_permutation(bao + 1, bao + p + 1));
cout << ans << endl;
return 0;
}