求助大佬
查看原帖
求助大佬
362762
lzyzs楼主2023/8/7 19:44

二分图法求助,样例过了,测试点一过了其他全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;
}
2023/8/7 19:44
加载中...