USACO3.1 Agri-Net(agrinet)

        最基本的最小生成樹問題,這裏運用Kruskal算法求解。ios

        早上順利回到了武漢,一下車,哎呀太熱了。。。算法

 

/*
ID:jzzlee1
PROB:agrinet
LANG:C++
*/
//#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
ifstream cin("agrinet.in");
ofstream cout("agrinet.out");
int n,m,u[10010],v[10010],w[10010],p[110],r[10010];
int cmp(const int i, const int j)
{
	return w[i]<w[j];
}
int find(int x)
{
	return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
	int ans=0;
	cin>>n;
	m=n*n;
	int i,j,k=0;
	//第i條邊的兩個端點序號和權值分別保存在u[i],v[i]和w[i]中
	for(i=0;i!=n;i++)
		for(j=0;j!=n;j++)
		{
			cin>>w[k];
			u[k]=i;
			v[k]=j;
			k++;
		}
	for(i=0;i!=n;i++)
		p[i]=i;//初始化並查集
	for(i=0;i!=m;i++)
		r[i]=i;//初始化邊序號
	sort(r,r+m,cmp);//給邊排序
	for(i=0;i!=m;i++)
	{
		//找出當前邊兩個端點所在集合編號
		int e=r[i];
		int x=find(u[e]);
		int y=find(v[e]);
		//若是在不一樣集合,合併
		if(x!=y)
		{
			ans+=w[e];
			p[x]=y;
		}
	}
	cout<<ans<<endl;
	return 0;
}
相關文章
相關標籤/搜索