题意:给你n个数,然后m中边的权值,求最小生成树,prime算法和dijkstra算法唯一的不同就是松弛时,prime是求最小邻边,而最短路是求两个点
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#define maxn 60
#define INF 0x3f3f3f3f
using namespace std;
int map[maxn][maxn];
int d[maxn];
bool vis[maxn];
int n,m;
int a,b,c;
void prime()
{
for(int i = 1; i <= n; i ++)
{
d[i] = map[1][i];
vis[i] = 0;
}
for(int i = 1; i <= n; i ++)
{
int minx = INF;
int now;
for(int j = 1; j <= n; j ++)
{
if(!vis[j] && minx > d[j])
{
now = j;
minx = d[j];
}
}
vis[now] = 1;
for(int k = 1; k <= n; k ++)
{
if(!vis[k] && d[k] > map[now][k])
d[k] = map[now][k];
}
}
int sum = 0;
for(int i = 1; i <= n; i ++)
sum += d[i];
printf("%d\n",sum);
}
int main()
{
while(~scanf("%d%d",&n,&m) && n)
{
for(int i = 0; i <= n; i ++)
for(int j = 0; j <= n; j ++)
{
if(i != j)
map[i][j] = INF;
else map[i][j] = 0;
}
for(int k = 1; k <= m; k ++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b] > c)
map[a][b] = map[b][a] = c;
}
prime();
}
return 0;
}