POJ 1258 Agri-Net 最小生成树
题意:有n个点,给你一个方阵代表他们两两之间的距离,求最小生成树。
思路:大水题,直接prim解决。
AC代码:
//
// main.cpp
// L
//
// Created by LucienShui on 2017/5/11.
// Copyright © 2017年 LucienShui. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#define memset(a,b) memset(a,b,sizeof(a))
#define ull unsigned long long
using namespace std;
const int maxn = 107, INF = 0x3f3f3f3f;
int mp[maxn][maxn],dist[maxn],n;
bool vis[maxn];
inline void init() {
for(int i=1 ; i<=n ; i++) {
for(int j=1 ; j<=n ; j++) {
scanf("%d",mp[i]+j);
}
}
}
inline void prim() {
int cur = 1,index,result = 0;
for(int i=1 ; i<=n ; i++) {
dist[i] = mp[cur][i];
vis[i] = false;
}
vis[cur] = true;
for(int i=1 ; i<n ; i++) {
int minn = INF;
for(int j=1 ; j<=n ; j++) {
if(!vis[j] && dist[j] < minn) {
minn = dist[j];
index = j;
}
}
vis[index] = true;
result += dist[index];
for(int i=1 ; i<=n ; i++) {
if(!vis[i] && mp[index][i] < dist[i]) {
dist[i] = mp[index][i];
}
}
}
printf("%d\n",result);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
while(~scanf("%d",&n)) {
init();
prim();
}
return 0;
}