prim 算法加模板
最小生成树的prim算法:
1,在顶点中任取一点,加入集合U中;
2,在集合外的点中找到离集合中的点中最近的点并构成路径,找到的点加入集合中;
3,重复2过程到树构建完毕;
举个栗子:
从1开始,1加入集合U中,2,3,4,在集合外;
选择离集合中点最近的点4,4加入集合中,2,3在集合外;
选择离集合中点最近的点2,2加入集合中,3在集合外;
选择离集合中点最近的点3,3加入集合中,完毕;
测试:
代码:
#include<iostream>
#include<cstring>
#include<climits>
using namespace std;
const int M=500;
int cost[M][M];
int Creat(){
int n,m;
cin>>n>>m;
for(int q=1;q<=n;q++){
for(int w=1;w<=n;w++)cost[q][w]=INT_MAX;
}
int a,b,c;
for(int q=1;q<=m;q++){
cin>>a>>b>>c;
cost[a][b]=c;
cost[b][a]=c;
}
return n;
}
void prim(int n){
int close[M],lowcost[M];
for(int q=1;q<=n;q++){
close[q]=1;
lowcost[q]=cost[1][q];
}
close[1]=-1;
for(int q=1;q<n;q++){
int Min=INT_MAX,u=q;
for(int w=1;w<=n;w++)if(close[w]!=-1 && lowcost[w]<Min){
Min=lowcost[w];
u=w;
}
cout<<"("<<close[u]<<","<<u<<")"<<" "<<lowcost[u]<<endl;
for(int w=1;w<=n;w++)if(close[w]!=-1 && lowcost[w]>cost[u][w]){
lowcost[w]=cost[u][w];
close[w]=u;
}
}
return;
}
int main() {
int t;
cin>>t;
while(t--){
int n=Creat();
prim(n);
}
return 0;
}

浙公网安备 33010602011771号