最小生成树的题,直接用prime就可以解决,模板题吧。
#include<cstdio>
#include<cstring>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 105;
int map[N][N], n, ans, dis[N];
bool vis[N];
void pri()
{
vis[1] = true;
for(int i=2; i<=n; ++i)
dis[i] = map[i][1];
int count = n-1;
ans = 0;
while(count--)
{
int mi = INF,k;
for(int i = 2; i <= n; ++ i)
if(!vis[i]&&mi>dis[i])
{
mi = dis[i];
k = i;
}
vis[k] = true;
ans += dis[k];
for(int i=2; i<=n; ++i)
if(!vis[i]&&map[i][k]<dis[i])
dis[i] = map[i][k];
}
}
int main(void)
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
scanf("%d", &map[i][j]);
memset(vis,false,sizeof(vis));
pri();
cout<<ans<<endl;
}
return 0;
}
本文深入探讨了最小生成树的概念,通过Prim算法解决实际问题,并提供了代码实现的详细步骤,适合计算机科学领域的读者了解和实践。
325

被折叠的 条评论
为什么被折叠?



