您的位置:首页 > 其它

POJ之路11-1789 Truck History

2015-06-15 21:31 357 查看

一、最小生成树实战-1789 Truck History

此题题意有点难理解,输入卡车数目和卡车类型的七位字母编码,要求选择一种派生的方法,使得派生的路径值最小,两个字母编码的不同个数即为路径值。根据题意,也就是求最小生成树的权值,然后表示成1/min_d的形式即可。

编写代码中,prim部分直接套用上一篇博客中的代码,只修改了输入数据建图的操作,AC的代码如下。

本来可以一次AC的,结果因为权值定义为min,变量冲突导致编译错误。以后注意变量不要定义为min或者max等。

#include<iostream>
#include<algorithm>
using namespace std;

#define inf 10000
#define max_type 2001
int vertex,edge;
int graph[max_type][max_type],fa[max_type];
int lowcost[max_type],lowsource[max_type],used[max_type],min_d;

char truck[2001][7];

void prim(int graph[][max_type],int vertex,int fa[])
{
int i,j,k;int mincost;
for(i=2;i<=vertex;i++)
{
lowcost[i]=graph[1][i];
lowsource[i]=1;
used[i]=0;
}
used[1]=1;
for(i=2;i<=vertex;i++)
{
mincost=inf;
for(j=2;j<=vertex;j++)
{
if((!used[j])&&lowcost[j]<mincost)
{
mincost=lowcost[j];
k=j;
}
}
//	cout<<lowsource[k]<<" "<<k<<" "<<mincost<<endl;
min_d+=mincost;
used[k]=1;
fa[k]=lowsource[k];

for(j=2;j<=vertex;j++)
{
if((!used[j])&&graph[j][k]<lowcost[j])
{
lowcost[j]=graph[j][k];
lowsource[j]=k;
}
}

}
}

int weight(char a[],char b[])
{
int count=0;
for(int i=0;i<7;i++)
{
if(a[i]!=b[i])
count++;
}
return count;
}

int main()
{
int i,j;
cin>>vertex;
while(vertex)
{
min_d=0;//最短路径初始化
for(i=1;i<=vertex;i++)
{
cin>>truck[i];
}
for(i=1;i<=vertex;i++)
{
fa[i]=-1;
for(j=1;j<=vertex;j++)
{
graph[i][j]=weight(truck[i],truck[j]);
}
}

prim(graph,vertex,fa);

cout<<"The highest possible quality is 1/";
cout<<min_d<<"."<<endl;

cin>>vertex;
}

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