您的位置:首页 > 其它

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两种方法。该题是稠密的图。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: