Kruskla.c
#include "Kruskal.h"
void prime()
{
int i, j, min, sum = 0;
int next;
int dis[1110];
for(i = 1; i <= n; i++)
{
dis[i] = map[1][i];//假设把1顶点当做源点
}
visit[1] = 1;
for(i = 2; i <= n; i++)//1到n编号, 操作n-1个顶点
{
min = INF;
next = -1;
for(j = 1; j <= n; j++)//找出距离1顶点路径最小的点来赋给next
{
if(visit[j] != 1 && dis[j] < min)
{
min = dis[j];
next = j;
}
}
if(next == -1)//n-1次应该每次都要更新一个next值,若有一次没有next值则不连通。
{
flag = 1;
return;//return返回主函数,输出-1
}
visit[next] = 1;
sum += min;//最短路径之和
for(j = 1; j <= n; j++)//根据新加的那个next点来"松弛"
{
if(visit[j] != 1 && map[next][j] < dis[j])//最小生成树与最短路径的区别是:
//最小生成树加进来的next点成为树里的节点,所以“松弛”其他点到“树”的最短距离即可
//最短路径:“松弛”的仍是到源点的距离
{
dis[j] = map[next][j];
}
}
}
printf("最少造价为:\n");
cout<<sum<<endl;
}
Kruskal.h
#include <iostream>
using namespace std;
int n, flag;
int map[1110][1110];
int visit[1110];
#define INF 0x3f3f3f
void prime();
main.c
#include <iostream>
#include <cstring>
#include "Kruskal.h"
using namespace std;
int main()
{
int i, a, b, c, m;
while(1)
{
cout<<"请输入小区数目和电网分布数:"<<endl;
cin>>n>>m;
memset(map, INF, sizeof(map));
memset(visit, 0, sizeof(visit));
cout<<"请输入电网分布情况为(分别为边的起点,终点,权值):"<<endl;
for(i = 0; i < m; i++)
{
cin>>a>>b>>c;
if(c < map[a][b])
{
map[a][b] = map[b][a] = c;//无向图
}
}
flag = 0;
prime();
if(flag)
cout<<"-1"<<endl;
}
return 0;
}