比赛 4043级NOIP2022欢乐赛4th 评测结果 AAA
题目名称 路由选择问题 最终得分 100
用户昵称 HeSn 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-07 20:36:47
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, p, st, to, g[2][100][100], ans, num;
vector<int> cd[100], w[100];
bool vis[100], ok[100];
void dfs(int x, int s) {
	if(x == to) {
		if(s != g[1][st][to]) {
			ans = min(ans, s);
		}
		return ;
	}
	if(s >= ans) {
		return ;
	}
	for(int i = 0; i < cd[x].size(); i ++) {
		int u = cd[x][i];
		if(!vis[u]) {
			vis[u] = 1;
			dfs(u, s + w[x][i]);
			vis[u] = 0;
		}
	}
}
signed main() {
	freopen("route.in", "r", stdin);
	freopen("route.out", "w", stdout);
	cin >> n >> st >> to;
	for(int i = 1; i <= n; i ++) {
		for(int j = 1; j <= n; j ++) {
			cin >> g[0][i][j];
			if(!g[0][i][j]) {
				g[0][i][j] = 0x3f3f3f3f;
			}
			else {
				cd[i].push_back(j);
				w[i].push_back(g[0][i][j]);
			}
			g[1][i][j] = g[0][i][j];
		}
	}
	cin >> p;
	for(int i = 1; i <= p; i ++) {
		int x;
		cin >> x;
		ok[x] = 1;
	}
	for(int i = 1; i <= n; i ++) {
		g[0][i][i] = g[1][i][i] = 0;
	}
	for(int k = 1; k <= n; k ++) {
		for(int i = 1; i <= n; i ++) {
			for(int j = 1; j <= n; j ++) {
				if(!ok[i] && !ok[j] && !ok[k]) {
					g[0][i][j] = min(g[0][i][j], g[0][i][k] + g[0][k][j]);
				}
				g[1][i][j] = min(g[1][i][j], g[1][i][k] + g[1][k][j]);
			}
		}
	}
	ans = 1e8;
	vis[st] = 1;
	dfs(st, 0);
	cout << g[0][st][to] << ' ' << g[1][st][to] << ' ' << ans << endl;
	return 0;
}