poj 1789 Truck History (Prim)
2016-02-24 11:23
411 查看
题意:历史上,曾用7个小写字母来表示每种truck的型号,每两种型号之间的差距为字母串中不同字母的个数。现在给出n种不同型号的truck,问怎样使
1/Σ(to,td)d(to,td)的值最小。
即找到一条连接所有truck的最短路径。典型的最小生成树的问题, Prim算法适合稠密图,Kruskal算法适合稀疏图,可以使用prim和kruskal两种方法。该题是稠密的图。
1/Σ(to,td)d(to,td)的值最小。
即找到一条连接所有truck的最短路径。典型的最小生成树的问题, Prim算法适合稠密图,Kruskal算法适合稀疏图,可以使用prim和kruskal两种方法。该题是稠密的图。
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <list> #include <queue> #include <map> using namespace std; #define L(i) i<<1 #define R(i) i<<1|1 #define INF 0xFFFFFFFF #define pi acos(-1.0) #define eps 1e-4 #define maxn 100010 #define MOD 1000000007 int n,edge[2010][2010]; int lowcost[2010], nearvex[2010]; void Prim(int u) { int sum_weight = 0; for(int i = 1; i <= n; i++) { lowcost[i] = edge[u][i]; nearvex[i] = u; } nearvex[u] = -1; //初始化俩个数组 for(int i = 1; i <= n; i++) { int v = -1, min = 100000; for(int j = 1; j <= n; j++) if(nearvex[j] != -1 && lowcost[j] < min) { v = j; min = lowcost[j]; } //在lowcost数组中找最小值 if(v != -1) { nearvex[v] = -1; sum_weight += lowcost[v]; for(int j = 1; j <= n; j++) { if(nearvex[j] != -1 && edge[v][j] < lowcost[j]) { lowcost[j] = edge[v][j]; nearvex[j] = v; } //更新lowcost数组 } } } printf("The highest possible quality is 1/%d.\n", sum_weight); } int main() { int u,v,w; char s[2010][11]; while(scanf("%d",&n) && n) { for(int i = 1; i <= n; i++) { scanf("%s",s[i]); for (int j = i-1; j > 0; j--) { int e = 0; for(int k = 0; k < 7; k++) if(s[i][k] != s[j][k]) e++; edge[i][j] = edge[j][i] = e; } } Prim(1); } return 0; }
相关文章推荐
- oracle中的(+)
- 域名301重定向
- robots.txt
- 2012年02月11日
- 搜索引擎收录入口
- 最好用的ico图标 制作软件 Axialis…
- dedecms arclist实现日,周,月及…
- NGINX 配置404错误页面转向
- 我的健康我做主”芋头有奇特功效-抗…
- 网络推广100法,果然很强悍。
- 外链工作表中文版(SEO专用)
- 蓝天上的风筝童年的梦
- 周立波说中国与美国的区别看了自己…
- iOS学习笔记59-UIView自带动画和核心动画(Core Animation)
- js堆栈溢出错误
- js堆栈溢出错误
- 策略模式(Strategy)
- 二叉树 之 非递归前序遍历
- Java实现几种常见排序方法
- Android系统性能调优工具介绍