过了,但DEV-C++没有输出
查看原帖
过了,但DEV-C++没有输出
539388
skw66615楼主2023/11/4 17:33
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;

struct data{int x,y,z;}t[N];
int n,m,ft[N];
bool comp(data t1,data t2)
{
	return t1.z>t2.z;
}
void part1()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		t[i]=(data){x,y,z};
	}
	sort(t+1,t+m+1,comp);
	for(int i=1;i<=n;i++)
		ft[i]=i;
}

struct edge{int id,val;};
vector<edge>p[N];
int find(int x)
{
	ft[x]==x?x:ft[x]=find(ft[x]);
}
void part2()
{
	for(int i=1;i<=m;i++)
	{
		int px,py,pz;
		int fx,fy;
		px=t[i].x;
		py=t[i].y;
		pz=t[i].z;
		fx=find(px);
		fy=find(py);
		if(fx!=fy)
		{
			ft[fx]=fy;
			p[px].push_back((edge){py,pz});
			p[py].push_back((edge){px,pz});
		}
	}
}

int f[N][20],depth[N],g[N][20];
void dfs(int x)
{
	for(int i=1;i<=15;i++)
	{
		f[x][i]=f[f[x][i-1]][i-1];
		g[x][i]=min(g[f[x][i-1]][i-1],g[x][i-1]);
	}
	int len=p[x].size();
	for(int i=0;i<len;i++)
	{
		int px=p[x][i].id;
		int val=p[x][i].val;
		if(depth[px])
			continue;
		depth[px]=depth[x]+1;
		f[px][0]=x;
		g[px][0]=val;
		dfs(px);
	}
}
void part3()
{
	for(int i=1;i<=n;i++)
		if(depth[i]==0)
		{
			depth[i]=1;
			dfs(i);
		}
}

int lca(int x,int y)
{
	if(depth[x]<depth[y])
		swap(x,y);
	int ans=2e9;
	for(int i=15;~i;i--)
		if(depth[y]<=depth[f[x][i]])
		{
			ans=min(ans,g[x][i]);
			x=f[x][i];
		}
	if(x==y)
		return ans;
	for(int i=15;~i;i--)
		if(f[x][i]!=f[y][i])
		{
			ans=min(ans,g[x][i]);
			ans=min(ans,g[y][i]);
			x=f[x][i],y=f[y][i];
		}
	ans=min(ans,g[x][0]);
	ans=min(ans,g[y][0]);
	return ans;
}
int T;
void get_ans()
{
	scanf("%d",&T);
	while(T--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(find(x)!=find(y))
			printf("-1\n");
		else
			printf("%d\n",lca(x,y));
	}
}
int main()
{
	part1();
	part2();
	part3();
	get_ans();
	return 0;
}
2023/11/4 17:33
加载中...