poj 1879 Truck History
本题链接:点击打开链接
题目大意:
输入n表示卡车辆数,输入每辆卡车编号。即长度为7的字符串,每辆卡车编号均可由其他类型编号衍生过来,求由当中一辆衍生出其他全部的最小衍生次数(有一个字符不同就需衍生一次)。
解题思路:
本题能够看做求最小生成树的问题,关键是图的构建。把每两辆车衍生次数作为权值,然后使用prime算法求解最小生成树,详细请參见代码:
#include<stdio.h> #include<string.h> #define INF 0xffffff int map[2020][2020]; int mark[2020],lowcost[2020]; char str[2020][10]; void prime(int n) { int sum=0; int vir=1; memset(mark,0,sizeof(mark)); for(int i=1;i<=n;i++) if(i!=vir) lowcost[i]=map[vir][i]; lowcost[vir]=0; mark[vir]=1; for(int i=2;i<=n;i++) { int min=INF; for(int j=1;j<=n;j++) { if(!mark[j]&&lowcost[j]<min) { min=lowcost[j]; vir=j; } } mark[vir]=1; sum+=min; for(int k=1;k<=n;k++) { if(!mark[k]&&lowcost[k]>map[vir][k]) { lowcost[k]=map[vir][k]; } } } printf("The highest possible quality is 1/%d.\n",sum); } int main() { int n; while(scanf("%d",&n),n) { memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) scanf("%s",str[i]); for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { for(int k=0;k<7;k++) { if(str[i][k]!=str[j][k]) { map[i][j]++; map[j][i]++; } } } } prime(n); } return 0; }