【最小生成树】洛谷 P3366 【模板】最小生成树
2021-04-15 18:29:00
# ACM
题链
$Kruskal$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <bits/stdc++.h> using namespace std; #define MS 200009 #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define MAXN 0x3f3f3f3f
int n,m; struct node{ int u,v,val; }p[MS]; int fa[MS];
int find(int x){ if(x == fa[x]) return x; else return fa[x] = find(fa[x]); }
void merge(int x,int y){ fa[find(y)] = find(x); }
bool cmp(node t1,node t2){ return t1.val < t2.val; }
int main() { ios::sync_with_stdio(false); cin >> n >> m; for(int i=1;i<=n;i++) fa[i] = i; for(int i=1;i<=m;i++){ cin >> p[i].u >> p[i].v >> p[i].val; } sort(p+1,p+m+1,cmp); int ans = 0; for(int i=1;i<=m;i++){ if(find(p[i].u) != find(p[i].v)){ merge(p[i].u,p[i].v); ans += p[i].val; } } int flag = 1; for(int i=1;i<=n;i++){ if(find(i) != find(1)) flag = 0; } if(flag) cout << ans << "\n"; else cout << "orz\n";
return 0; }
|
$Prim$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <bits/stdc++.h> using namespace std; #define MS 5009 #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define MAXN 0x3f3f3f3f
int n,m; struct node{ int to,val; }; vector<node > vc[MS]; struct nod{ int poi,val; }; priority_queue<nod > Q; int dis[MS]; int v[MS];
bool operator < (nod t1,nod t2){ return t1.val > t2.val; }
int main() { ios::sync_with_stdio(false); cin >> n >> m; for(int i=1;i<=m;i++){ int u,v,w; cin >> u >> v >> w; vc[u].push_back({v,w}); vc[v].push_back({u,w}); } for(int i=1;i<=n;i++) dis[i] = MAXN; dis[1] = 0; Q.push({1,0}); int ans = 0; while(!Q.empty()){ nod x = Q.top(); Q.pop(); if(v[x.poi]) continue; v[x.poi] = 1; ans += x.val; for(auto &it:vc[x.poi]){ if(dis[it.to] > it.val){ dis[it.to] = it.val; if(!v[it.to]){ Q.push({it.to,dis[it.to]}); } } } } cout << ans << "\n";
return 0; }
|
2021-04-15 18:29:00
# ACM