Floyd + dfs 10 分求助(两个样例可过)
查看原帖
Floyd + dfs 10 分求助(两个样例可过)
525056
I_love_LPN_Forever楼主2022/1/24 09:41
#include <bits/stdc++.h>
#define maxn 105
#define INF 0x3f
using namespace std;
int dis[maxn][maxn], n, p;
int a[maxn], ans = INF;
bool flag[15];
void floyd(int n) {
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (dis[i][k] != 0 && dis[k][j] != 0) {
					dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
				}
			}
		}
	}
} 
void dfs(int now, int m, int sum) {
	if (m == 0) {
		ans = min(sum + dis[now][n], ans);
		return;
	}
	for (int i = 1; i <= p; i++) {
		if (!flag[i]) {
			flag[i] = 1;
			dfs(a[i], m - 1, sum + dis[now][a[i]]);
			flag[i] = 0;
		}
	}
}
int main() {
	cin >> n;
	memset(dis, INF, sizeof(dis));
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int w;
			cin >> w;
			dis[i][j] = min(dis[i][j], w); //处理重边 
		}
	}
	cin >> p;
	for (int i = 1; i <= p; i++) {
		cin >> a[i];
	}
	floyd(n);
	dfs(1, p, 0);
	cout << ans << endl;
	return 0;
} 
2022/1/24 09:41
加载中...