poj 1789

来源:互联网 发布:哪个淘宝搜词软件好 编辑:程序博客网 时间:2024/05/19 02:00

继续水题,练习prim模版的写法,记住一点:prim适合稠密图(用点),kruskal适合稀疏图(用边),算法复杂度分别为:O(n2),O(eloge)

本题关键在于看懂题目,知道如何派生车型,以及知道如何算不同车型之间的距离,找到连接所有车型的最短距离

qwertyxk1789Accepted15876K438MSGCC941B2012-12-20 21:28:45

#include<stdio.h>#define MAX 999999#define NUM 2000char 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;}


原创粉丝点击