【BZOJ 1601】 灌水
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=1601
【算法】
最小生成树
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 310 struct Edge { int x,y,w; } e[MAXN*MAXN]; int i,j,w,n,ans,tot; int s[MAXN]; inline bool cmp(Edge a,Edge b) { return a.w < b.w; } inline int find(int x) { if (s[x] == x) return x; return s[x] = find(s[x]); } int main() { scanf("%d",&n); for (i = 1; i <= n; i++) { scanf("%d",&w); e[++tot] = (Edge){0,i,w}; } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { scanf("%d",&w); if (i < j) e[++tot] = (Edge){i,j,w}; } } for (i = 1; i <= n; i++) s[i] = i; sort(e+1,e+tot+1,cmp); for (i = 1; i <= tot; i++) { if (find(e[i].x) != find(e[i].y)) { s[find(e[i].x)] = find(e[i].y); ans += e[i].w; } } printf("%d\n",ans); return 0; }