Animals
蒟蒻

最小生成树模板

Kruskal

#include<bits/stdc++.h>
using namespace std;
int father[5005],ans;
struct bian{
	int data,l,r,c;
}b[5005];
int getfather(int p){
	if(father[p]==p) return p;
	return father[p]=getfather(father[p]);
}
void uni(int x,int y){
	int fx=getfather(x);
	int fy=getfather(y);
	if(fx!=fy) father[fx]=fy;
}
bool cmp(const bian x,const bian y){
	return x.data<y.data;
}
int main(){
	int t=0,x,y,n,k;
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].data);
	}
	for(int i=1;i<=n;i++){
		father[i]=i;
	}
	sort(b+1,b+k+1,cmp);
	for(int j=1;j<=k;j++){
		int sum=0;
		if(!b[j].c&&(getfather(b[j].l)!=getfather(b[j].r))){
			uni(b[j].l,b[j].r);
			b[j].c=1;
			cout<<b[j].l<<"->"<<b[j].r<<endl;
			ans+=b[j].data;
		}
	}
	cout<<"ans="<<ans;
}

  


 

 

Prim

#include<bits/stdc++.h>
using namespace std;
int b[5005],vis[5005],a[5005][5005],ans=0;
int main(){
	int n,k,x,y;
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		cin>>x>>y;
		cin>>a[x][y];
		a[y][x]=a[x][y];
	}
	k=1;
	for(int i=1;i<=n;i++){
		if(a[i][k]) vis[i]=a[i][k];
		else vis[i]=2147483647;
	}
	b[1]=1;
	for(int i=1;i<=n-1;i++){
		int m=2147483647;
		cout<<k<<"->";
		k=0;
		for(int j=1;j<=n;j++){
			if(vis[j]<m&&vis[j]&&!b[j]){
				m=vis[j];
				b[j]=1;
				b[k]=0;
				k=j;
			}
		}
		cout<<k<<endl;
		ans+=m;
		vis[k]=0;
		for(int j=1;j<=n;j++){
			if(vis[j]>a[j][k]&&a[j][k]&&!b[j]){
				vis[j]=a[j][k];
			}
		}
	}
	printf("%d",ans);
	return 0;
}

  

posted @ 2018-11-02 08:46  年下丶  阅读(136)  评论(0编辑  收藏  举报
--- 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 ---