目标算法:Prim算法
应用范围:MST
算法代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
using namespace std;
const int maxn = 305;
const int Inf = 0x3f3f3f;
int dis[maxn];
int map[maxn][maxn];
int vis[maxn];
int N;
void init()
{
for(int i=0;i<N;i++)
{
dis[i] = map[i][0];
vis[i] = 0;
}
} //距离和访问数组初始化
int prim()
{
init();
dis[0] = 0; //起点距离初始化为0
vis[0] = 1; //标记起点
int ans = 0; //权值和初始化为0
for(int i=0;i<N-1;i++)
{
int temp = Inf; // 记录最小边
int flag; //纪录最小点
for(int j=0;j<N;j++)
{
if(!vis[j] && dis[j] < temp)
{
temp = dis[j];
flag = j;
}
} //找最小边
vis[flag] = 1; //标记选出的边
ans += dis[flag]; //把边加入生成树中
for(int j=0;j<N;j++)
{
if(!vis[j] && dis[j] > map[flag][j])
dis[j] = map[flag][j]; //更新最小权值
}
}
return ans;
}
int main()
{
while(~scanf("%d",&N))
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
scanf("%d",&map[i][j]); //邻接矩阵存图
}
int ans = prim();
printf("%d\n",ans);
}
return 0;
}