Kruskal 模板(Hdu - 1162)
阿新 • • 發佈:2018-08-03
模板 out esp hdu printf true double eof kruskal
最小生成樹指的是在圖上面找到權值最小的一棵樹,並且保證圖上所有的點都在這棵樹上。
解決辦法:Kruskal 算法(貪心思想)
/** * Fuck you. * I love you too. */ #include<bits/stdc++.h> #define lson i<<2 #define rson i<<2|1 #define LS l,mid,lson #define RS mid+1,r,rson #define mem(a,x) memset(a,x,sizeof(a)) #define gcd(a,b) __gcd(a,b) #define ll long long #define ull unsigned long long #define lowbit(x) (x&-x) #define enld endl #define mian main #define itn int #define prinft printf const double PI = acos (-1.0); const int INF = 0x3f3f3f3f; const int EXP = 1e-8; const int N = 1e5 + 5; const int MOD = 1e9 + 7; const int MAXN = 1e5 + 5; using namespace std; int n; int ans; int par[N]; struct ed { int s, e, cost; } edge[MAXN]; bool cmp (ed a, ed b) { return a.cost < b.cost; } int Find (int a) { return a == par[a] ? a : par[a] = Find (par[a]); } void join (int a, int b) { par[Find (a)] = Find (b); } int main() { while (~scanf ("%d", &n)) { ans = 0; for (int i = 0; i < n; ++i) { scanf ("%d%d%d", &edge[i].s, &edge[i].e, &edge[i].cost); par[edge[i].s] = edge[i].s; par[edge[i].e] = edge[i].e; } sort (edge, edge + n, cmp); for (int i = 0; i < n; ++i) { if (Find (edge[i].s) != Find (edge[i].e)) { cout << edge[i].s << ‘ ‘ << edge[i].e << endl; join (edge[i].s, edge[i].e); ans += edge[i].cost; } } cout << ans << endl; } return 0; }
Kruskal 模板(Hdu - 1162)