#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> usingnamespace std; int n, m; constint N = 1e5 + 10, M = 3 * N, INF = 0x3f3f3f3f; structEdge { int a, b, w; booloperator < (const Edge & W ) { return w < W.w; }//kruskal先找最小边排序; }edges[N]; int p[N];//并查集找公共祖先,则为连通的,那么不能取; intfind( int x){ if (p[x] != x) p[x] = find(p[x]);//找到下一个没有用过的点; return p[x]; } intkruskal(){
sort(edges, edges + m);//对m条边排序; for (int i = 1; i <= n; i++) p[i] = i;//初始化每个节点的父节点为自己;
int cnt = 0, res = 0; for (int i = 0; i < m; i++) { int a = edges[i].a, b = edges[i].b, w = edges[i].w; a = find(a), b = find(b);//找祖先节点; if (a != b) { p[a] = b;//合并,如果祖先节点不同; res += w;//添加一条路径 cnt ++; } } //n个点的图的最小生成树为n - 1条边; if (cnt < n - 1) return0x3f3f3f3f;
return res; }
intmain(){ cin >> n >> m; for (int i = 0; i < 6; i++) { int a, b, w; scanf("%d%d%d", &a, &b, &w); edges[i] = {a, b, w}; } int result = kruskal(); if (result == INF) puts("-1 -"); elseprintf("%d", result);
constint N = 1e4, M = 3e4 + 10, INF = 0x3f3f3f3f; int n, m; int g[N][N]; int dist[N]; bool st[N];
intprim(){ memset(dist, 0x3f, sizeof dist); int res = 0; for (int i = 0; i < n; i++) { int t = -1; for (int j = 1; j <= n; j++) { if (!st[j] && (t == -1 || dist[j] < dist[t])) { t = j; } } if (i && dist[t] == INF) return INF; if (i) res += dist[t]; st[t] = true; for (int j = 1; j <= n; j++) { dist[j] = min(dist[j], g[t][j]); //松弛操作有点类似dijkstra算法,但这是该点到最小生成树的最短距离,而dijkstra是到起点的最短距离 } } return res; }
intmain(){ cin >> n >> m; memset(g, 0x3f, sizeof g); // 初始化邻接矩阵为INF for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); if (c < g[a][b]) { g[a][b] = c; g[b][a] = c; } } int result = prim(); cout << result << endl; return0; }