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;
}




posted @ 2017-10-07 18:39  琳小羽  阅读(292)  评论(0)    收藏  举报