zoukankan      html  css  js  c++  java
  • 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.
    ",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;
    }


     

  • 相关阅读:
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    第5次作业
    4
    第三次
    2
    11
    第五次作业
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7353445.html
Copyright © 2011-2022 走看看