典型的MST(最小生成树)。
因为看到题目中图的形式是邻接矩阵给出的,就直接用Prim了
题目大意:
给出你一个N*N的邻接矩阵表示的图,a[i][j]表示i到j的权值,求MST
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int vMAX = 105;
const int INF = 0x3f3f3f3f;
int Graph[vMAX][vMAX];
int n;
int MST()
{
int dis[vMAX];
bool vis[vMAX];
for(int i = 0 ; i < n ; i++)
{
dis[i] = Graph[0][i];
vis[i] = false;
}
vis[0] = true;
dis[0] = 0;
int mindis;
for(int i = 1 ; i < n ; i++)
{
int tmp;
mindis = INF;
for(int j = 0 ; j < n ; j++)
{
if(dis[j] < mindis && !vis[j])//选出当前最短的一条边
{
mindis = dis[j];
tmp = j;
}
}
dis[tmp] = mindis;
vis[tmp] = true;
for(int j = 0 ; j < n ; j++)//dis更新
{
if(Graph[tmp][j] < dis[j] && !vis[j])
{
dis[j] = Graph[tmp][j];
}
}
}
int ans = 0;
for(int i = 0 ; i < n ; i++)
{
ans += dis[i];
}
return ans;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
while(scanf("%d",&n) != EOF)
{
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
scanf("%d",&Graph[i][j]);
}
}
int ans = MST();
printf("%d\n",ans);
}
return 0;
}