闻灌佬多(P1948求调)
  • 板块灌水区
  • 楼主Super_Masarada
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/27 11:05
  • 上次更新2024/9/27 14:32:57
查看原帖
闻灌佬多(P1948求调)
935377
Super_Masarada楼主2024/9/27 11:05
#include <bits/stdc++.h>
namespace SXL {
	using std::deque;
	using std::min;
	constexpr int MAXN = 1005;
	int edge[MAXN][MAXN];
	int dis[MAXN],vis[MAXN];
	int n,p,k;
	int check(int x) {
		memset(dis,0,sizeof(dis));
		memset(vis,0,sizeof(vis));
		deque<int> q;
		q.push_back(1);
		dis[1] = 0;
		vis[1] = 1;
		int tmp;
		while(!q.empty()) {
			tmp = q.front();
			q.pop_front();
			for(int i = 1;i <= n;i++) {
				if(edge[tmp][i] < 0 || (vis[i] && dis[i] < dis[tmp] + 1)) continue;
				dis[i] = dis[tmp] + (edge[tmp][i] > x ? 1 : 0);
				vis[i] = 1;
				if(edge[tmp][i] > x) q.push_back(i);
				else q.push_front(i);
			}
		}
		return dis[n] <= k;
	}
	void main() {
		memset(edge,0xc0,sizeof(edge));
		scanf("%d%d%d",&n,&p,&k);
		for(int i = 1,a,b,l;i <= n;i++) {
			scanf("%d%d%d",&a,&b,&l);
			edge[a][b] = l;
			edge[b][a] = l;
		}
		int l = 1,r = 1000000,mid;
		while(l < r) {
			mid = (l + r) / 2;
			if(check(mid)) {
				r = mid;
			} else {
				l = mid + 1;
			}
		}
		printf("%d\n",l != 1 ? l : -1);
	}
}
int main() {
	SXL::main();
	return 0;
}
2024/9/27 11:05
加载中...