```
for(register int i=1;i<=n;i++)
```
改成
```
for(register int i=1;i<=m;i++)
```
by AMIRIOX無暝 @ 2021-02-24 23:13:00
@[Coros_Trusds](/user/430409)
kruskal排序完边之后,枚举的是边数,所以把count和sum下面的for循环里的n改成m就过了
另外数组开2e5
by AMIRIOX無暝 @ 2021-02-24 23:14:05
@[Coros_Trusds](/user/430409)
1. 数组开小了
2. 遍历边应该是从1~m,加个计数器,如果选了n-1条边就退出
3. 无解输出`orz`
by WanderingTrader @ 2021-02-24 23:16:31
@[wandering_trader](/user/270791) 这题数据弱 没有orz的情况
话说无解情况要单独开一个并查集判断吗
by AMIRIOX無暝 @ 2021-02-24 23:23:44
你没有判断是否n-1条边了。
题目可能给出的图不连通你也没考虑。
每次merge后count++,最后看count是否等于n-1。
等于就输出sum,否则不连通。
by TheOnlyMan @ 2021-02-24 23:33:31
改了下代码,AC了:
```cmp
#include <cstdio>
#include <algorithm>
using namespace std;
int f[1000005];
struct edge
{
int u,v;
int w;
}e[1000005];
inline bool cmp(edge x,edge y)
{
return x.w<y.w;
}
inline int get(int x)
{
if(f[x]==x)
{
return x;
}
return f[x]=get(f[x]);
}
inline void merge(int x,int y)
{
int f1=get(x);
int f2=get(y);
if(f1!=f2)
{
f[f1]=f2;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++)
{
f[i]=i;
}
for(register 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);
int count=0,sum=0;
for(register int i=1;i<=m;i++)
{
if(get(e[i].u)==get((e[i].v)))
{
continue;
}
count++;
sum+=e[i].w;
merge(e[i].v,e[i].u);
if(count==n-1)
{
printf("%d\n",sum);
return 0;
}
}
printf("orz\n");
return 0;
}
by Coros_Trusds @ 2021-02-25 09:00:00