poj 1879 Truck History

来源:互联网 发布:centos安装raid驱动 编辑:程序博客网 时间:2024/06/05 16:16

本题链接:点击打开链接

题目大意:

        输入n表示卡车辆数,输入每辆卡车编号,即长度为7的字符串,每辆卡车编号均可由其它类型编号衍生过来,求由其中一辆衍生出其它所有的最小衍生次数(有一个字符不同就需衍生一次)。

解题思路:

        本题可以看做求最小生成树的问题,关键是图的构建,把每两辆车衍生次数作为权值,然后使用prime算法求解最小生成树,具体请参见代码:

#include<stdio.h>#include<string.h>#define INF 0xffffffint 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;}


 

0 0
原创粉丝点击