站外题求条
  • 板块学术版
  • 楼主LonginusMonkey
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/26 21:39
  • 上次更新2023/11/27 12:20:44
查看原帖
站外题求条
326254
LonginusMonkey楼主2023/11/26 21:39

poj1797

思路是二分答案+bfs

nlogn

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int maxn = 100100;
int vis[maxn];
struct node{
	int to, w;
};
vector<node > vec[maxn];
int n, m; 
bool check(int mid) {
	queue< int> que;
	memset(vis, 0, sizeof vis); que.push(1);
	while(!que.empty()) {
		int index = que.front(); vis[index] = 1; que.pop(); 
		for(int i=0; i<vec[index].size(); ++i) {
			if(vis[vec[index][i].to] || vec[index][i].w > mid) continue;
			que.push(vec[index][i].to);
		}
	}
	if(vis[n]) {
		return true;
	} else {
		return false;
	}
}
signed main() {
	int c; cin >> c;
	cout << "Scenario #" << c << endl;
	cin >> n >> m;
	int l = 0, r = 0;
	for(int i=1; i<=m; ++i) {
		int u, v, w; cin >> u >> v >> w; r = max(r, w);
		vec[u].push_back({v, w});
		vec[v].push_back({u, w});
	}
	int mid, ans = r;
	while(l <= r) {
		mid = l + r >> 1;
		if(check(mid)) {
			r = mid-1;
			ans = mid;
		} else {
			l = mid+1;
		}
	} 
	cout << ans;
	return 0;
}
2023/11/26 21:39
加载中...