思路大概是二分答案然后check函数里对每个情况建图,之后dfs搜查有没有奇环。初步怀疑是dfs函数写错,但找不出来。
评测记录,(点1已过)
对于第二组数据(数据太大不方便展示)输出
31191而非31065。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double lb;
const int N=2e4+5,M=1e5+5;
int n,m;
struct node{
int u,v,num;
}arr[M];
bool cmp(node a,node b){
if(a.num<b.num) return 1;
else return 0;
}
vector<int> vt[N];bool vis[N];
bool dfs(int i,int num,int fa){
bool flag=1;
if((int)vt[i].size()==0){
vis[i]=1;
return 1;
}
vis[i]=1;
for(auto u:vt[i]){
if(u==fa) continue;
if(vis[u]){
if((num+1)%2==1) return 0;
}else{
flag=dfs(u,num+1,i);
if(!flag) return 0;
}
}
return 1;
}
bool check(int mid){
for(int i=1;i<=n;i++) vt[i].clear(),vis[i]=0;
for(int i=mid+1;i<=m;i++){
int u=arr[i].u,v=arr[i].v;
vt[u].push_back(v);
vt[v].push_back(u);
}
int f=1;
for(int i=1;i<=n;i++){
if(!vis[i]) f=dfs(i,0,i);
if(!f) break;
}
if(!f) return 0;
else return 1;
}
int ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].num);
}
sort(arr+1,arr+m+1,cmp);
int l=0,r=m;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
r=mid-1;
ans=mid;
}else l=mid+1;
}
printf("%d",arr[ans].num);
return 0;
}
/*
*/