poj1258 Agri-Net ——————【 Kruskal 】
2014-08-11 16:11
399 查看
这是一道全裸的最小生成树,因为所给的图是对称的且为无向图,所以只需要取一个三角就能把所有边情况表示出来。
#include<stdio.h> #include<limits.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int Max=550; int father[Max]; int n,m; struct node { int st_p; int en_p; int co; } edge[Max*Max]; void init() //初始化i的父亲节点为i { for(int i=0; i<Max; i++) father[i]=i; } int Find(int x) //查找x的父亲节点,递归调用 { return father[x]==x? x:father[x]=Find(father[x]); } void Union(int x,int y) //合并x和y { x=Find(x),y=Find(y); if(x!=y) { if(x>y) father[x]=y; else father[y]=x; } } void input() { m=0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { int temp; scanf("%d",&temp); if(i>=j) //取三角入边 continue; edge[m].st_p=i; edge[m].en_p=j; edge[m++].co=temp; } } } bool cmp(node a,node b) //将边升序排序 { return a.co<b.co; } void kruskal() { int ans=0,st,en; sort(edge,edge+m,cmp); for(int i=0; i<m; i++) { st=edge[i].st_p; en=edge[i].en_p; st=Find(st); en=Find(en); if(st!=en) //如果不在一个集合中,合并 { ans+=edge[i].co; father[en]=st; } } printf("%d\n",ans); } int main() { while(scanf("%d",&n)!=EOF) { init(); input(); kruskal(); } return 0; }
相关文章推荐
- POJ 1258 Agri-Net (kruskal求最小生成树)
- [poj 1258]Agri-Net[Kruskal模板题]
- Poj 1258 Agri-Net (最小生成树Prim & Kruskal)
- poj 1258 Agri-Net(Kruskal || Prim )
- poj 1258 Agri-Net 【Prim&Kruskal】
- POJ 1258 Agri-Net (prim + kruskal)
- poj 1258 小白算法练习 Agri-Net 最小生成树 prim kruskal
- POJ 1258-Agri-Net (Kruskal)
- POJ 1258-Agri-Net (Kruskal)
- Poj 1258 Agri-Net(最小生成树 kruskal)
- 文章标题 POJ 1258 : Agri-Net(最小生成树--kruskal)
- POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)
- poj 1258 Agri-Net 最小生成树 kruskal
- POJ 1258 Agri-Net 克鲁斯卡尔(Kruskal)算法&并查集
- poj 1258 Agri-Net 【最小生成树-Kruskal】
- POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)
- POJ 1258 Agri-Net (Prim&Kruskal)
- POJ 1258 Agri-Net 最小生成树 prim && kruskal
- poj 1258 Agri-Net【Kruskal】
- poj 1258 Agri-Net 最小生成树 kruskal