您的位置:首页 > 其它

Truck History POJ 1789 ZOJ 2158 Prim算法

2013-03-31 21:21 375 查看
就是Prim算法,求最小生成树,把每个汽车编号看成点,两个编号的距离,也就是相同位置不同字符的数目,就看做边,显然,看成无向图,谁生成谁自己想想就行了 ,这里边比较多,用Prim算法。

代码:

View Code

#include <cstdio>
#define MAXN 2005
int n;
int lowcost[MAXN];
int edge[MAXN][MAXN];
int dis(char a[],char b[])
{
int s = 0;
for(int i=0; i<7; i++)
if(a[i] != b[i] ) s++;
return s;
}
void Prim()
{
int i,j;
int sum=0;
for(i=0; i<n; i++)
lowcost[i] = edge[0][i];
lowcost[0] = -1;
for(i=1; i<n; i++)
{
int min= 1000000;
int v;
for(j=0; j<n; j++)
{
if(lowcost[j] != -1 && lowcost[j] <min)
{
v = j;
min = lowcost[j];
}
}
sum += lowcost[v];
lowcost[v] = -1;
for(j=0; j<n; j++)
{
if(lowcost[j] != -1 && edge[v][j] < lowcost[j])
lowcost[j] = edge[v][j];
}
}
printf("The highest possible quality is 1/%d.\n",sum);
}
int main()
{
//    freopen("out.cpp","r",stdin);
while(~scanf("%d",&n) && n != 0)
{
int i,j;
char a[MAXN][8];
for(i=0; i<n; i++)
scanf("%s",a[i]);
for(i=0; i<n; i++)
{
for(j =i; j<n; j++)
{
if(i == j ) edge[i][j] = 0;
else
{
edge[i][j] = dis(a[i],a[j]);
edge[j][i] = edge[i][j];
}
}
}
Prim();
}
return 0;
}


这题很成功地过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: