30分求助
查看原帖
30分求助
1211899
Bobi2014楼主2024/8/8 16:32
#include<bits/stdc++.h>
using namespace std;
const int N = 20010,M = 100010;
struct edge{
	int ed,next,len; 
} b[M * 2];
int n,m,nbs[N],tot,maxx;
bool vis1[N],vis2[N];
queue<int> q;
void addedge(int u,int v,int l){
	b[++tot].ed = v;b[tot].len = l;b[tot].next = nbs[u];nbs[u] = tot;
}
bool bfs(int x){
	while(q.empty() == false){
		q.pop();
	}
	q.push(1);
	memset(vis1,false,sizeof(vis1));
	vis1[1] = true;
	memset(vis2,false,sizeof(vis2));
	while(q.empty() == false){
		int u = q.front();
		for(int i = nbs[u];i;i = b[i].next){
			if(b[i].len > x){
				int v = b[i].ed;
				if((vis1[u] == true and vis1[v] == true) or (vis2[u] == true and vis2[v] == true)){
					return false;
				}
				if(vis1[v] == true or vis2[v] == true){
					continue;
				}
				if(vis1[u] == true){
					vis2[v] = true;
				}else{
					vis1[v] = true;
				}
				q.push(v);
			}
		}
		q.pop();
	}
	return true;
}
int main(){
	freopen("D:\\Download\\P1525_2.in","r",stdin);
	cin >> n >> m;
	for(int i = 1,u,v,l;i <= m;i ++){
		cin >> u >> v >> l;
		addedge(u,v,l);
		addedge(v,u,l);
		maxx = max(maxx,l);
	}
	int l = 0,r = maxx,ans;
	while(l <= r){
		int mid = (l + r) / 2;
		if(bfs(mid) == true){
			ans = mid;
			r = ans - 1;
		}else{
			l = mid + 1;
		}
	}
	cout << ans;
	return 0;
}

2024/8/8 16:32
加载中...