畅通工程我发现的误区
有已建成的不要在生成树之前合并
为什么?
因为是按权重排的
如果已建成的权重是很大的可能没有机会遍历到
我们转换成把他的权重记为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;
}
}

浙公网安备 33010602011771号