有没有 大佬看一下哪错了qwq

P3366 【模板】最小生成树

不要加反边
by K0stlin @ 2021-12-18 10:49:43


@[j_steady](/user/559503) ```cpp #include<bits/stdc++.h> #define int long long using namespace std; int n,m,x,y,len,cnt,ans,sum,fa[10005]; struct node { int x,y,len; }edge[200005]; bool cmp(node x,node y) { return x.len<y.len; } int find(int x) { if (fa[x]==x) return x; return fa[x]=find(fa[x]); } void unionn(int x,int y) { int fx=find(x); int fy=find(y); if (fx!=fy) { cnt++; fa[fx]=fy; } return ; } void kruskal() { sort(edge+1,edge+1+m,cmp); for(int i=1; i<=m; i++) { int x=find(edge[i].x); int y=find(edge[i].y); if (x!=y) { unionn(x,y); ans+=edge[i].len; if (cnt==n-1) break; } } return ; } signed main() { cin >> n >> m; for(int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=m; i++) cin >> edge[i].x >> edge[i].y >> edge[i].len; kruskal(); for(int i=1; i<=n; i++) if (fa[i]==i) sum++; if (sum==1) cout << ans; else cout << "orz"; return 0; } ```
by kdy20100729 @ 2021-12-18 10:50:24


```cpp for (int i=1;i<=m;i++){ int a,b,c; scanf ("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } ``` 去掉 `add(b,a,c)`。
by 404Not_Found @ 2021-12-18 10:51:08


@[404Not_Found](/user/280473) 为什么加了反边会错qwq
by j_steady @ 2021-12-18 10:54:58


@[Kostlin](/user/114830) 谢谢orz
by j_steady @ 2021-12-18 10:56:41


Kruskal 每条边只要知道两端点的信息。 并且你 sort 只 排序了前 $m$ 条边,但你加了 $2m$ 条,实际上你跑 Kruskal 只跑了一半的边。并且 Kruskal 是用并查集维护双向关系的,
by 404Not_Found @ 2021-12-18 11:01:24


@[j_steady](/user/559503)
by 404Not_Found @ 2021-12-18 11:02:56


Kruskal 要知道的只是边的连通性。
by 404Not_Found @ 2021-12-18 11:03:29


@[404Not_Found](/user/280473) 懂了太强了!orz Thank you
by j_steady @ 2021-12-18 11:10:12


|