40分求助
查看原帖
40分求助
363036
chlchl楼主2021/9/27 21:02

蒟蒻不会 Floyd,跑了 nn 遍 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;
}
2021/9/27 21:02
加载中...