1. 程式人生 > >洛谷 #1550. 打井

洛谷 #1550. 打井

題意

在一個點打井cost[i],連線兩個點dis[i][j],求使所有點間接或直接與水井連通的最小花費

題解

對於在一個點打井,視為與0節點連一條邊,然後krusual即可

除錯記錄

#include <cstdio>
#include <algorithm>
#define maxn 305

using namespace std;

struct node{
	int u, v, l;
}e[maxn * maxn << 2];
int tot = 0;
void addedge(int u, int v, int l)
{e[++tot] = (node){u, v, l};} bool cmp(const node &a, const node &b){return a.l < b.l;} int n, f[maxn]; int getf(int x){return (f[x] == x) ? x : f[x] = getf(f[x]);} int Krusual(){ sort(e + 1, e + tot + 1, cmp); for (int i = 1; i <= n; i++) f[i] = i; int res = 0; for (int i = 1; i <=
tot; i++){ if (getf(e[i].u) != getf(e[i].v)){ f[getf(e[i].u)] = getf(e[i].v); res += e[i].l; } } return res; } int main(){ scanf("%d", &n); for (int x, i = 1; i <= n; i++){ scanf("%d", &x); addedge(0, i, x); } for (int x, i = 1; i <= n; i++) for (int j = 1; j <=
n; j++){ scanf("%d", &x); addedge(i, j, x); } printf("%d\n", Krusual()); return 0; }