题意:输入一个邻接矩阵,求最小生成树。
思路:裸的prim模板题。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
int N;
int mp[120][120];
const int inf = 0x3f3f3f3f;
void prim(int x)
{
int book[120], vis[120], ans;
memset(book, 0, sizeof(book));
for (int i = 1; i <= N; i++)
vis[i] = mp[x][i];
ans = 0;
book[x] = 1;
for (int i = 1; i < N; i++)
{
int mi = inf, f = -1;
for (int j = 1; j <= N; j++)
{
if (!book[j] && vis[j]<mi)
{
mi = vis[j];
f = j;
}
}
if (f==-1)
{
return;
}
book[f]=1;
ans += mi;
for (int j = 1; j <= N; j++)
{
if (!book[j] && vis[j]>mp[f][j])
vis[j] = mp[f][j];
}
}
printf("%d\n", ans);
return ;
}
int main(void)
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while (~scanf("%d", &N))
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
scanf("%d", &mp[i][j]);
if (i==j)
mp[i][j] = inf;
}
prim(1);
}
return 0;
}