poj 1258 Agri-Net
这里,本来是用prim算法更好一点,但是,emmm,确实还没有掌握该算法的具体实现步骤,所以先使用了Kruskal算法进行求解,对于这类图的问题,需要先转化成两点之间线路的形式进行存储后再使用Kruskal算法进行求解。
#include <iostream>
#include <string.h>
#include <algorithm>
#define MAX 105
#define MAXN 20000
using namespace std;
struct Edges
{
int from;
int to;
int s;
}edges[MAXN];
int father[MAX];
int map[MAX][MAX],ans;
void init(int n)
{
for(int i = 1; i <= n; i++){
father[i] = i;
}
}
int Find(int node)
{
while(node != father[node]){
node = father[node];
}
return node;
}
bool cmp(Edges a,Edges b)
{
return a.s < b.s;
}
void Kruskal(int m)
{
sort(edges,edges + m,cmp);
for(int i = 0; i < m; i++){
int u = Find(edges[i].from);
int v = Find(edges[i].to);
if(u != v){
father[u] = v;
ans += edges[i].s;
}
}
}
int main()
{
int n;
while(cin>>n){
int m = 0;
ans = 0;
init(n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin>>map[i][j];
}
}
for(int i = 1; i <= n; i++){//这里是将图转化为一般Kruskal算法题目的输入方式后再进行求解。
for(int j = 1; j <= n; j++){
edges[m].from = i;
edges[m].to = j;
edges[m].s = map[i][j];
m++;
}
}
Kruskal(m);
cout<<ans<<endl;
}
return 0;
}