70分求调,用的djksl,dfs实现
查看原帖
70分求调,用的djksl,dfs实现
918894
XyGetItRightAker楼主2023/10/14 12:22
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<queue>
using namespace std;
int ans = 0x3f3f3f3f;
int n, k, x, y;
int G[21][21];//记录路径长
int num[21];//记录自身的权值
bool vis[21];
void dfs(int i, int cnt);
int main() {
	memset(num, 0, sizeof(num));
	for (int i = 1; i <= 20; i++) {
		for (int j = 1; j <= 20; j++) {
			G[i][j] = -1;
		}
	}
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> G[i][(i % n) + 1];
		G[(i % n) + 1][i] = G[i][(i % n) + 1];
	}
	for (int i = 1; i <= k; i++) {
		char st, ed;
		int val;
		cin >> st >> ed >> val;
		if (st != ed) {
			G[st - 'A' + 1][ed - 'A' + 1] = max(G[st - 'A' + 1][ed - 'A' + 1], val);
			G[ed - 'A' + 1][st - 'A' + 1] = max(G[ed - 'A' + 1][st - 'A' + 1], val);
		}

		else {
			num[st - 'A' + 1] = max(num[st - 'A' + 1], val);
		}

	}
	char st, ed;
	cin >> st >> ed;
	x = st - 'A' + 1, y = ed - 'A' + 1;
	dfs(x, num[x]);
	cout << ans;
	return 0;
}

void dfs(int i, int cnt) {
	if (cnt > ans) {
		return;
	}
	if (i == y) {
		ans = cnt;
		return;
	}
	for (int j = 1; j <= n; j++) {
		if (i == j)continue;
		if (G[i][j] != -1 && !vis[j]) {
			vis[j] = 1;
			dfs(j, cnt + num[j] + G[i][j]);
			vis[j] = 0;
		}
	}
}


//queue<int>a;
//queue<int>cnt;
//a.push(x); cnt.push(num[x]);
//vis[x] = 1;
//while (!a.empty()) {
//	int i = a.front();
//	int cn = cnt.front();
//	a.pop(), cnt.pop();
//	if (i == y) {
//		ans = min(ans, cn);
//		continue;
//	}
//	for (int j = 1; j <= n; j++) {
//		if (G[i][j] && vis[])
//
//
//	}
//}
2023/10/14 12:22
加载中...