1. 程式人生 > >【BZOJ 1601】 灌水

【BZOJ 1601】 灌水

style #define bzoj https ble http int != zoj

【題目鏈接】

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; }

【BZOJ 1601】 灌水