二分图法求助,样例过了,测试点一过了其他全wa
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
struct edge{
int nt,z;
}temp;
edge al(int x,int y)
{
temp.nt=x,temp.z=y;
return temp;
}
vector <edge> ma[N];
int col[N],vis[N];
bool dfs(int x,int color,int k)
{
if(vis[x]) return 1;
col[x]=color,vis[x]=1;
for(int i=0;i<ma[x].size();i++)
{
// cout << x << ' ' << ma[x][i].nt << ' ' << color << ' ' << k << ' ' << ma[x][i].z << endl;
if(ma[x][i].z>=k)
{
if(col[ma[x][i].nt]&&col[x]==col[ma[x][i].nt]) return 0;
if(!dfs(ma[x][i].nt,3-color,k)) return 0;
}
}
return 1;
}
bool Ai_li_xi_ya(int k)
{
for(int i=1;i<=n;i++) if(!col[i]) if(dfs(i,1,k)) return 1;
return 0;
}
int main()
{
cin >> n >> m;
vector<int> ef;
ef.push_back(0);
for(int i=0;i<m;i++)
{
int x,y,z;
cin >> x >> y >> z;
ef.push_back(z);
ma[x].push_back(al(y,z));
ma[y].push_back(al(x,z));
}
sort(ef.begin(),ef.end());
int l=0,r=ef.size()-1;
while(l<r-1)
{
for(int i=1;i<=n;i++) col[i]=0,vis[i]=0;
int mid=(l+r)>>1;
if(Ai_li_xi_ya(ef[mid])) r=mid;
else l=mid;
}
cout << ef[l] << endl;
return 0;
}