程序采用二分图染色+二分答案,10pts,求调
查看原帖
程序采用二分图染色+二分答案,10pts,求调
777854
Patrickpanpan楼主2024/8/6 18:06
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
	int v,next,w;
};
int p[2000001];
Edge e[2000001];
int n,m;
int num=0;
bool vis[2000001];
int col[2000001];
int a[2000001];
long long l,r,mid;
void add(int u,int v,int w)
{
	e[num].v=v;
	e[num].w=w;
	e[num].next=p[u];
	p[u]=num++;
}
int tmp=0;
bool dfs(int u)
{
	for(int i=p[u];i!=-1;i=e[i].next)
	{
		int v=e[i].v;
		if(e[i].w<a[mid])continue;
		if(col[v]==col[u] && e[i].w>=a[mid])
		{
			return false;
		}
		if(vis[v]==false && e[i].w>=a[mid])
		{	
			vis[v]=true;
			if(col[v]==0)
			{
				col[v]=3-col[u];
			}
			dfs(v);
		}
	}
	return true;
}
bool check(int mid)
{
	memset(vis,false,sizeof(vis));
	memset(col,0,sizeof(col));
	for(int i=1;i<=n;i++)
	{
		if(col[i]==0)
		{
			col[i]=1;
			if(dfs(i)==false)return false;
		}
	}
	return true;
}
int main()
{
	memset(p,-1,sizeof(p));
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int l,r,w;
		cin>>l>>r>>w;
		a[i]=w;
		add(l,r,w);
		add(r,l,w);
	}
	if(m==1)
	{
		cout<<0<<endl;
		return 0;
	}
	sort(a+1,a+1+m);
	l=0,r=m;
	while(l<r)
	{
		mid=(l+r)/2;		
		if(check(mid)==true)r=mid;
		else l=mid+1;
	}
	cout<<a[l]<<endl;
	return 0;
} 
2024/8/6 18:06
加载中...