Kruskal10分求助

P3366 【模板】最小生成树

``` 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


|