畅通工程我发现的误区

有已建成的不要在生成树之前合并
为什么?
因为是按权重排的
如果已建成的权重是很大的可能没有机会遍历到
我们转换成把他的权重记为0 这样优先“建成”
之前测试用例过了就没管 原来的写法是有局限性的是AC不了的!!!

#include <bits/stdc++.h>
using namespace std;
int fa[105];
int n,m;
struct node
{
	int u,v,w;
	bool operator < (const node&it) const
	{
		return w<it.w;
	}
}e[5000];
int find(int x)
{
	return fa[x]==x ? x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
	fa[find(x)]=find(y);
}
int kru()
{
	sort(e,e+m);
	int ans=0;int count=0;
	for(int i=0;i<m;i++)
	{
		int u=e[i].u;int v=e[i].v;int w=e[i].w;
		if(find(u)!=find(v))
		{
			merge(u,v);
			ans+=w;count++;
		}
		if(count==n-1) break;
	}
	return ans;
}
int main()
{
	while(cin>>n)
	{
		if(n==0) break;
		for(int i=1;i<=n;i++)
		{
			fa[i]=i;
		}
		memset(e,0,sizeof(e));
		m=n*(n-1)/2;
		for(int i=0;i<m;i++)
		{
			int uu,vv,ww,ss;
			cin>>uu>>vv>>ww>>ss;
			if(ss) ww=0;
			e[i]={uu,vv,ww};
			
		}
		int ans=kru();
		cout<<ans<<endl;
	}
}
posted @ 2025-11-25 21:35  ll今天也要加油啊  阅读(0)  评论(0)    收藏  举报