natie @ 2024-08-19 13:13:11
有点乱,求调,谢谢!
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z,cnt=0,cnt2=0,fa[20010];
int find(int x)
{
if(x==fa[x])
{
return x;
}
return fa[x]=find(fa[x]);
}
struct ba{
int d1,d2,cd;
}a[200010];
bool cmp(ba x,ba y)
{
return x.cd<y.cd;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
a[i].d1=x;
a[i].d2=y;
a[i].cd=z;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(find(a[i].d1)==find(a[i-1].d1))
{
continue;
}
fa[find(a[i].d1)]=find(a[i].d2);
cnt2+=a[i].cd;
cnt++;
if(cnt==n-1)
{
break;
}
}
for(int i=1;i<=n;i++)
{
if(find(fa[i])!=find(fa[n]))
{
cout<<"orz";
return 0;
}
}
cout<<cnt2;
return 0;
} ``````
by natie @ 2024-08-19 13:14:33
样例会输出9而不是7
by xujinxuan01 @ 2024-08-19 13:22:17
if(find(a[i].d1)==find(a[i-1].d1))
{
continue;
}
改
if(find(a[i].d1)==find(a[i].d2))
{
continue;
}
即可过。
by natie @ 2024-08-19 13:22:49
谢谢!
by xujinxuan01 @ 2024-08-19 13:23:50
if(find(a[i].d1)==find(a[i-1].d1))
{
continue;
}
这里i-1
是上一条边,而应该判的是该边的两端是否在同一个连通块内,因为最小生成树不能有环。
by natie @ 2024-08-19 13:30:05
其实是大改的时候忘记改了