经典的求最小生成树的题目,只不过题目中的路线是由关联矩阵所给出的,还是套用最经典的算法,把所有的边按照长度从小到大进行排序,然后利用并查集顺次判断每条路的出发点和目的地是不是已经在一个等价类内部了,如果不是的话把这条边的长度加到总长度上然后把两个地点放在同一个等价类里面。
另外注意本题一个case里面有很多组测试数据,注意初始化。
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <cstdio>
using namespace std;
#define MAXN 105
struct node{
int dis;
int begin,end;
};
bool operator < (node a, node b){
return a.dis < b.dis;
}
int map[MAXN][MAXN]={0};
int n;
node road[MAXN*MAXN]={0};
int cnt = 0;
int belong[MAXN]={0};
int total = 0;
int find_fa(int k){
if(k == belong[k])
return k;
int temp = belong[k];
belong[k] = find_fa(temp);
return belong[k];
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(belong,0,sizeof(belong));
memset(map,0,sizeof(map));
memset(road,0,sizeof(road));
total = 0;
cnt = 0;
for(int i=1;i<=n;++i){
belong[i] = i;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%d",&map[i][j]);
if(i==j)
continue;
node temp;
temp.dis = map[i][j];
temp.begin = i;
temp.end = j;
road[cnt] = temp;
cnt++;
}
}
sort(road,road+cnt);
for(int i=0;i<cnt;++i){
int b_fa = find_fa(road[i].begin);
int e_fa = find_fa(road[i].end);
if(b_fa == e_fa)
continue;
total += road[i].dis;
belong[e_fa] = b_fa;
}
printf("%d\n",total);
}
//system("pause");
return 0;
}