Idea: el
cerebro no es muy sobrio. . .
Hay dos cárceles para estos internos, y luego tendrá un efecto si las dos áreas en conflicto están en la misma prisión.
Ahora le permite generar el valor mínimo del impacto máximo.
Nuestra respuesta dicotómica: valor de impacto máximo
, es decir, los prisioneros mayores que este valor máximo definitivamente serán encarcelados en dos prisiones diferentes.
Hay un límite entre los dos prisioneros de , y estos dos presos definitivamente pertenecerán a dos prisiones diferentes (conjunto de puntos), si
factible, entonces definitivamente se formará un gráfico bipartito, por lo que usamos el método de teñido para juzgar si es un gráfico bipartito y así determinar si el esquema es factible.
struct Edge{
int next;
int to;
int dis;
}edge[N<<1];
int head[N<<1],tot;
inline void add(int from,int to,int dis){
edge[++tot].next = head[from];
edge[tot].to = to;
edge[tot].dis = dis;
head[from] = tot;
}
int color[N];
bool dfs(int x,int d){
bool r = 1;
for(int i = head[x];i;i = edge[i].next){
int y = edge[i].to;
int dis = edge[i].dis;
if(dis > d){
if(color[y] == 0) {color[y]=color[x]==1?2:1;r = dfs(y,d);if(r==0) return false;}
else if(color[y] == color[x]) return false;
}
}
return true;
}
bool ok(int m,int n){
memset(color,0,sizeof color);
rep(i,1,n){
if(!color[i]) {
color[i] = 1;
bool r = dfs(i,m);
if(r == 0) return false;
}
}
return true;
}
int main(){
int l(0),r(0);
int n = read(),m = read();
rep(i,1,m){
int u = read(),v = read(),d = read();
add(u,v,d);
add(v,u,d);
r = max(r,d);
}
while(l < r){
int mid = l + r >> 1;
if(ok(mid,n)) r = mid;
else l = mid + 1;
}
cout << r;
}