继续水题,练习prim模版的写法,记住一点:prim适合稠密图(用点),kruskal适合稀疏图(用边),算法复杂度分别为:O(n2),O(eloge)
本题关键在于看懂题目,知道如何派生车型,以及知道如何算不同车型之间的距离,找到连接所有车型的最短距离
qwertyxk | 1789 | Accepted | 15876K | 438MS | GCC | 941B | 2012-12-20 21:28:45 |
#include<stdio.h>
#define MAX 999999
#define NUM 2000
char trucks[NUM+10][8];
int map[NUM+10][NUM+10],lowCost[NUM+10];
int prim(int N)
{
int result=0,i,j,k,minCost;
lowCost[1]=-1;
for(i=2;i<=N;i++)
lowCost[i]=map[1][i];
for(i=2;i<=N;i++)
{
minCost=MAX;
for(j=2;j<=N;j++)
{
if(lowCost[j]>0&&lowCost[j]<minCost)
{
minCost=lowCost[j];
k=j;
}
}
lowCost[k]=-1;
result+=minCost;
for(j=2;j<=N;j++)
lowCost[j]=map[k][j]<lowCost[j]?map[k][j]:lowCost[j];
}
return result;
}
int main()
{
int N;
while(scanf("%d",&N))
{
if(N==0)
break;
int i,j,k;
for(i=1;i<=N;i++)
{
scanf("%s",&trucks[i]);
for(j=1;j<=i-1;j++)
{
int diff=0;
for(k=0;k<=6;k++)
if(trucks[i][k]!=trucks[j][k])
diff++;
map[i][j]=map[j][i]=diff;
}
map[i][i]=0;
}
printf("The highest possible quality is 1/%d.\n", prim(N));
}
return 0;
}