P3366[模板]最小生成樹
阿新 • • 發佈:2020-06-27
如題,給出一個無向圖,求出最小生成樹,如果該圖不連通,則輸出 orz。
輸入格式
第一行包含兩個整數 N,M,表示該圖共有 N 個結點和 M 條無向邊。
接下來 M行每行包含三個整數 X_i,Y_i,Z_i,表示有一條長度為 Z_i的無向邊連線結點 X_i,Y_i
輸出格式
如果該圖連通,則輸出一個整數表示最小生成樹的各邊的長度之和。如果該圖不連通則輸出 orz。
輸入輸出樣例
輸入 #1複製
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
輸出 #1複製
7
說明/提示
資料規模:
對於 100% 的資料:\(1\le N\le 5000 ,1\le M\le 2\times 10^5\)
prim
#include <bits/stdc++.h> namespace FastIO { char buf[1 << 21], buf2[1 << 21], a[20], *p1 = buf, *p2 = buf, hh = '\n'; int p, p3 = -1; void read() {} void print() {} inline int getc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } inline void flush() { fwrite(buf2, 1, p3 + 1, stdout), p3 = -1; } template<typename T, typename... T2> inline void read(T &x, T2 &... oth) { int f = 0; x = 0; char ch = getc(); while (!isdigit(ch)) { if (ch == '-') f = 1; ch = getc(); } while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getc(); } x = f ? -x : x; read(oth...); } template<typename T, typename... T2> inline void print(T x, T2... oth) { if (p3 > 1 << 20) flush(); if (x < 0) buf2[++p3] = 45, x = -x; do { a[++p] = x % 10 + 48; } while (x /= 10); do { buf2[++p3] = a[p]; } while (--p); buf2[++p3] = hh; print(oth...); } } // namespace FastIO #define read FastIO::read #define print FastIO::print //====================================== using namespace std; const int maxn=5e3+10; const int inf=0x3f3f3f3f; typedef long long ll; int n,m,e[maxn][maxn],ans,vis[maxn],d[maxn]; int main() { #ifndef ONLINE_JUDGE freopen("1.txt", "r", stdin); //freopen("2.txt", "w", stdout); #endif //====================================== read(n, m); memset(e,0x3f,sizeof(e)); for (int i = 1, u, v, w; i <= m; i++) { read(u, v, w); e[u][v] = min(e[u][v], w); e[v][u] = min(e[v][u], w); } memset(d, 0x3f, sizeof(d)); for (int i = 1; i <= n; i++) { d[i] = e[1][i]; } vis[1]=1; for (int i = 1; i <= n; i++) { int mi = inf, miv = -1; for (int j = 1; j <= n; j++) { if (!vis[j] && d[j] < mi) { mi = d[j]; miv = j; } } if (miv == -1) break; vis[miv] = 1; ans += mi; //print(mi); for (int j = 1; j <= n; j++) { if (!vis[j]) { d[j] = min(d[j], e[miv][j]); } } } print(ans); //====================================== FastIO::flush(); return 0; }