萌新求助样例全 NO
  • 板块CF891C Envy
  • 楼主Harry27182SDream
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/6/27 08:10
  • 上次更新2023/10/27 22:29:30
查看原帖
萌新求助样例全 NO
376997
Harry27182SDream楼主2022/6/27 08:10

rt,写的是 kruskal 最小生成树,并查集用了按秩合并,求调

#include<bits/stdc++.h>
using namespace std;
struct edge
{
	int u,v,w;
}e[500005];
struct node
{
	int id,u,v,w;
};
int f[500005],size[500005],flag[500005],ans[500005],n,m,q,k,x;
vector<node>a[500005];
bool cmp(edge a,edge b)
{
	return a.w<b.w;
}
int find(int x)
{
	while(x!=f[x])x=f[x];
	return x;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		scanf("%d",&k);
		for(int j=1;j<=k;j++)
		{
			scanf("%d",&x);
			a[e[x].w].push_back((node){i,e[i].u,e[i].v,e[i].w});
		}
		ans[i]=1;
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=n;i++)f[i]=i,size[i]=1;
	for(int i=1;i<=m;i++)
	{
		int val=e[i].w;
		stack<int>st;
		for(int j=0;j<a[val].size();j++)
		{
			if(!ans[a[val][j].id])continue;
			if(j>0&&a[val][j].id!=a[val][j-1].id)
			{
				while(!st.empty())
				{
					int u=st.top();
					st.pop();
					size[f[u]]-=flag[u];
					f[u]=u;flag[u]=0;
				}
			}
			int u=find(a[val][j].u),v=find(a[val][j].v);
			if(u==v){ans[a[val][j].id]=0;continue;}
			if(size[u]>size[v])swap(u,v);
			f[u]=v;size[v]+=(size[u]==size[v]);flag[u]=(size[u]==size[v]);
			st.push(u);
		}
		while(e[i].w==val)
		{
			int u=find(e[i].u),v=find(e[i].v);
			if(u==v){i++;continue;}
			if(size[u]>size[v])swap(u,v);
			f[u]=v;size[v]+=(size[u]==size[v]);flag[u]=(size[u]==size[v]);
			st.push(u);
			i++;
		}
		if(e[i].w!=val)i--;
	}
	for(int i=1;i<=q;i++)
	{
		if(ans[i])printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2022/6/27 08:10
加载中...