(思路不太一样好像)#22分求调#
查看原帖
(思路不太一样好像)#22分求调#
1177110
kds2012楼主2025/5/23 22:14

这个蒟蒻不想用图论算法
我这个代码用DFS反着推,样例能过,剩下不知炸哪了
烂码:

#include <bits/stdc++.h>
using namespace std;
struct p {
	int x;
	int v;
};
vector<p> r[27];
int g[27];
bool flag[27];
bool vis[27];
int getc(char x) {
	if(x >= 'a' && x <= 'z') {
		return x - 'a';
	}
	else {
		return x - 'A';
	}
}
void dfs(int x, int fa, int road) {
	vis[x] = true;
	g[x] = road;
	for (int i = 0; i < r[x].size(); i++) {
		int to = r[x][i].x;
		if (to != fa && !vis[to] && road + r[x][i].v < g[to]) {
			dfs(to, x, road + r[x][i].v);
		}
	}
	vis[x] = false;
}
int main() {
	int p;
	cin >> p;
	for (int i = 0; i < 26; i++) {
		g[i] = 114514;
		flag[i] = false;
		vis[i] = false;
	}
	for (int i = 1; i <= p; i++) {
		char xx, yy;
		int k;
		cin >> xx >> yy >> k;
		int x = getc(xx);
		int y = getc(yy);
		if (xx >= 'A' && xx <= 'Z') flag[x] = true;
		if (yy >= 'A' && yy <= 'Z') flag[y] = true;
		if (x == 25 && y == 25) continue;
		r[x].push_back({y, k});
		r[y].push_back({x, k});
	}
	dfs(25, -1, 0);
	int ans = 114514, ans_id = 0;
	for (int i = 0; i < 25; i++) {
		if (flag[i] && (g[i] < ans || (g[i] == ans && i < ans_id))) {
			ans = g[i];
			ans_id = i;
		}
	}
	cout << (char)(ans_id + 'A') << ' ' << ans;
	return 0;
}

(看不懂问我,每日在线)

2025/5/23 22:14
加载中...