不开O2TLE,开O2MLE
查看原帖
不开O2TLE,开O2MLE
297566
Tan_Wei_Ye楼主2021/2/2 15:16

求助

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxm=5e5+10;
const int maxq=3e5+10;
int n,m,q,fa[maxn],ans[maxq];
set<int> Q[maxn];
set<int> :: iterator it;
struct edge
{
	int u,v,w;
}e[maxm];
int find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
bool cmp(edge x,edge y)
{
	return x.w>y.w;
}
void merge(int x)
{
	int fx=find(e[x].u);
	int fy=find(e[x].v);
	if(fx==fy) return;
	fa[fx]=fy;
	vector<int>tmp;
	for(it = Q[fx].begin();it!=Q[fx].end();it++)
	{
		int id=*it;
		if(Q[fy].count(id))
		{
			ans[id]=e[x].w;
			tmp.push_back(id);
		}
		Q[fy].insert(id);
	}
	for(int i=0;i<tmp.size();i++)
		Q[fy].erase(tmp[i]);
} 
int main() 
{
	memset(ans,-1,sizeof(ans));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	sort(e+1,e+m+1,cmp);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Q[x].insert(i);
		Q[y].insert(i);
	}
	for(int i=1;i<=m;i++)
		merge(i);
	for(int i=1;i<=q;i++)
		cout<<ans[i]<<endl;
}
2021/2/2 15:16
加载中...