poj1797最大生成树
2015-09-18 20:31
363 查看
//1348K 454MS //注意不是生成整棵树而是只要可以到达N点就行了 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define MAXE 1000005 #define MAXN 1006 static struct edge { int from; int to; int cost; }Edge[MAXE]; static int E; static int cmp(const edge&ls,const edge&rs) { return ls.cost>rs.cost; } static int par[MAXN]; static int N; static void init() { for (int i=0;i<N;++i) par[i] = i; } static int getParent(int i) { if (par[i]!=i) par[i] = getParent(par[i]); return par[i]; } static void merge(int u,int v) { int p1 = getParent(u); int p2 = getParent(v); if (p1==p2) return; par[p1] = p2; } static bool same(int u,int v) { int p1 = getParent(u); int p2 = getParent(v); if (p1==p2) return true; return false; } static void addEdge(int from,int to,int cost) { Edge[E].from = from; Edge[E].to = to; Edge[E].cost = cost; E++; } static int krustral() { sort(Edge,Edge+E,cmp); int ans = -1; int res = 0; for (int i=0;i<E;++i) { if (same(0,N-1))//能到达N点就行了 break; edge e = Edge[i]; if (!same(e.from,e.to)) { ans = e.cost; merge(e.from,e.to); } } printf("%d\n",ans); printf("\n"); return res; } int main() { int T; scanf("%d",&T); int ncase = 1; int es; while(T--) { scanf("%d %d",&N,&es); int u,v,c; E = 0; for (int i=0;i<es;++i) { scanf("%d %d %d",&u,&v,&c); addEdge(u-1,v-1,c); addEdge(v-1,u-1,c); } init(); printf("Scenario #%d:\n",ncase); ncase++; krustral(); } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例