prim算法,写得比较简陋,没有向书中那样用adjvex数组记录关系而是用的vis记录是否达到,与dijkstra算法非常相似。
#include <iostream>
using namespace std;
int const maxn = 510;
int map[maxn][maxn];
int n;
int isch[maxn],vis[maxn];
int cost[maxn],fag[maxn];
const int INF = 0x3f3f3f3f;
int f() {
int ans = -1;
for (int i=0;i<n;i++) {
vis[i] =0;
cost[i]=map[0][i];
}
vis[0] = 1;
int tmp = INF;
int k=0;
for (int j=0;j<n-1;j++) {
tmp = INF;
for (int i=0;i<n;i++) {
if (tmp>cost[i]&&!vis[i]) {
tmp = cost[i]; k=i;
}}
if(ans<tmp) ans = tmp;
vis[k] = 1;
for (int i=0;i<n;i++) {
if(!vis[i]&&cost[i]>map[k][i])
cost[i] = map[k][i];
}
}
return ans;
}
int main() {
int t;
cin>>t;
for (int i=0;i<t;i++) {
cin>>n;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++) {
cin>>map[i][j];
}
cout<<f()<<endl;
if(i!=t-1) cout<<endl;
}
}
本文介绍了一个简陋版的Prim算法实现,该算法用于寻找加权图中的最小生成树。与Dijkstra算法类似,使用了vis数组来标记顶点是否被加入到生成树中,并通过不断更新各顶点到已生成树的距离来逐步构建最小生成树。
1149

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



