题目描述:
有n个农场,两两之间有路,求连接所有农场最小的花费。
大致思路:
最小生成树的模板题。Prim,克鲁斯卡尔……等等,能搞就行!
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100 + 10;
int g[maxn][maxn];
int n;
int prim() {
int dist[maxn];
bool vis[maxn];
memset(vis,0,sizeof(vis));
memset(dist,inf,sizeof(dist));
dist[1] = 0;
while (1) {
int l = 0;
for (int i = 1; i <= n; i++) {
if (!vis[i] && dist[i] < dist[l]) l = i;
}
if (!l) break;
for (int j = 1; j <= n; j++) {
if (j == l) continue;
if (!vis[j]) dist[j] = min(dist[j],g[l][j]);
}
vis[l] = true;
}
int ans = 0;
for (int i = 1; i <= n; i++) ans += dist[i];
return ans;
}
int main() {
while (cin>>n) {
memset(g,0,sizeof(g));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d",&g[i][j]);
}
}
cout<<prim()<<endl;
}
}