纪中OJ 5771【NOIP2008模拟】遨游

看到题是一个求区间,我就果断想了二分,我们二分一个下界,看在这个下界的限制下是否还有边可以连接起点和终点

于是我们转到了判断连通性还要保证最大边边权最小的问题,显然这是一棵最小生成树,只需要记录第一条联通起点所在块与终点所在块的边的边权,这就是R

注意点:二分的左端点要设成0,因为会有优惠完后边权小于一的边,之后二分时可以联通l=mid+1,否则r=mid,我因为把这个玩意写成了l=mid , r=mid-1正解TLE成了20分,还没暴力分高。。。。。

代码

//By AcerMo
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int M=100500;
struct edge
{
	int fr,to,w1;
	double w2;
}e[M];
vectorv[M];
int la,ra;
int n,m,st,ed,nd;
int fa[M],sh[M],be[M],siz[M];
bool vis[M];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
inline void constt()
{
	for (int i=1;i<=nd;i++) fa[i]=i,siz[i]=1;
	return ;
}
inline bool cmp(edge a,edge b)
{
	return a.w2>1;kru(mid);
		if (fa[ed]==fa[st]) l=mid+1;
		else r=mid;
	}
	cout<

 

你可能感兴趣的:(图论-最小生成树)