poj1258 Agri-Net

来源:互联网 发布:淘宝网品牌休闲男装 编辑:程序博客网 时间:2024/06/15 07:35

http://poj.org/problem?id=1258

本题似乎是一个很裸的最小生成树,加上多组数据。

按照题目输入,这题用prim代码复杂度会低很多,因为输入就是一个现成邻接矩阵
而我就写了一个kruscal

kruscal基于贪心思想,将所有边按边权从小到大排序,然后一条一条加入,一开始各点在不同集合里,每加入一条边判断:如果当前边两个端点不在同一个集合里,合并集合并累加答案,否则放弃这条边
这可以用并查集来实现
#include<iostream>#include<algorithm>#include<cmath>#include<cstdlib>using namespace std;struct ppap{int a,b,c;}d[100001];int fa[1001];int getfather(int v){if(fa[v]==v)return v;fa[v]=getfather(fa[v]);return fa[v];}bool cmp(ppap a,ppap b){return a.c<b.c;}int main(){int n;while(cin>>n){int nedge=0;for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){int x;cin>>x;if(i>=j)continue;nedge++;d[nedge].a=i;d[nedge].b=j;d[nedge].c=x;}sort(d+1,d+nedge+1,cmp);int k=1,ans=0;for(int i=1;i<=nedge;i++){int x=getfather(d[i].a),y=getfather(d[i].b);if(x!=y){k++;ans+=d[i].c;fa[x]=y;}if(k==n)break;}cout<<ans<<endl;}return 0;}


2 0
原创粉丝点击