全RE求调,玄关
查看原帖
全RE求调,玄关
890257
CarlosProvo楼主2024/6/2 09:41
#include<bits/stdc++.h>
using namespace std;
int n,m,h[500001],idx=1,f[100001],Q;
struct rey
{
	int u,v,w;
}E[500001];
struct node
{
	int ne,tv,w;
}e[500001];
struct fin
{
	int ip,minw;
};
queue<fin> q;
bool cmp(rey E1,rey E2)
{
	return E1.w>E2.w;
}
int find(int x)
{
	if(f[x]==x)return x;
	else return f[x]=find(f[x]);
}
void add(int U,int V,int W)
{
	e[idx].tv=V;
	e[idx].ne=h[U];
	e[idx].w=W;
	h[U]=idx++;
}
void kruskal()
{
	for(int i=1;i<=m;i++)
	{
		int x=find(E[i].u),y=find(E[i].v);
		if(x!=y)
		{
			f[x]=y;
			add(E[i].u,E[i].v,E[i].w);
		}
	}
}
int bfs(int now,int goal)
{
	for(int i=h[now];i!=-1;i=e[i].ne)
	{
		q.push({e[i].tv,e[i].w});
	}
	while(q.size())
	{
		fin tmp=q.front();
		q.pop();
		if(tmp.ip==goal)return tmp.minw;
		else
		{
			for(int i=h[tmp.ip];i!=-1;i=e[i].ne)
			{
				q.push({e[i].tv,min(e[i].w,tmp.minw)});
			}
		}
	}
}
int main()
{
	memset(h,-1,sizeof h);
	cin>>n>>m;
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++)
	{
		cin>>E[i].u>>E[i].v>>E[i].w;
	}
	sort(E+1,E+m+1,cmp);
	kruskal();
	cin>>Q;
	for(int i=1;i<=Q;i++)
	{
		int S,F;
		cin>>S>>F;
		if(find(S)!=find(F))
		{
			cout<<-1<<endl;
			continue;
		}
		else cout<<bfs(S,F)<<endl;
	}
	return 0;
}
2024/6/2 09:41
加载中...