prim 算法加模板

来源:互联网 发布:新手淘宝刷手机单步骤 编辑:程序博客网 时间:2024/06/11 09:35

最小生成树的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;}




原创粉丝点击