最后一个点qwq
查看原帖
最后一个点qwq
190322
Varuxn楼主2020/12/25 17:16

o2,快读改用的都用了,orz 求助

#include<bits/stdc++.h>
using namespace std;
int n,m,t,ans=INT_MAX,fa[50005];
bool b;
struct jz
{
	int l,r,t;
}s[200005];
bool comp(jz x,jz y)
{
	return x.t<y.t;
}
int find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
int k(int l)
{
	if(m-l+1<n-1) return -1;
	int tot=n,maxn=-1,minn=INT_MAX;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=l;i<=m;i++)
	{
		if(find(s[i].l)!=find(s[i].r))
		{
			tot--;
			fa[find(s[i].l)]=find(s[i].r);
			maxn=max(maxn,s[i].t);
			minn=min(minn,s[i].t);
		}
		if(tot==1)
			return maxn-minn;
	}
	return -1;
}
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
   return s*w;
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=m;i++)
	{
		s[i].l=read();
		s[i].r=read();
		s[i].t=read();
	}
	sort(s+1,s+m+1,comp);
	for(int i=1;i<=m;i++)
	{
		if(s[i+n-2].t-s[i].t>ans) continue;
		int num=k(i);
		if(num!=-1)
		{
			b=true;
			ans=min(num,ans);
		}
		else break;
	}
	if(!b) printf("-1");
	else printf("%d",ans);
	return 0;
}
2020/12/25 17:16
加载中...