zoukankan      html  css  js  c++  java
  • POJ 1789 Prim算法

    要求图的最小生成树的长度之和,边集表示已找到的最小距离的边

    初始d数组,表示点到此边集的最小距离,如果d[i]==0,则说明i点在边集中

    dis二维数组,表示两点间的距离

    初始时,d[i]表示i点到0点距离,d[0]=1

    找出d[i]中的最小值d[min],把min点加入边集,对于除了边集中的所有点j,如果j到min的距离比d[j]小,则d[j]=dis[j][min],(原d[j]为到0点的距离,这样d[j]永远都是到边集的最小距离)

    #include <iostream>
    #define MAX 2001
    char types[MAX][8];
    char dis[MAX][MAX];
    char d[MAX];
    #define INF 127
    int prim(int n){
        int i,j,k,ti;
        int mindis,total=0;
    	d[0]=0;
    	for(i=1;i<n;i++)
    		d[i]=dis[i][0];
        for(i=1;i<n;i++){
            mindis=INF;
    		
            //找到最小权值
            for(k=0;k<n;k++)
            {
                if(d[k]&&d[k]<mindis){
                    
    					ti = k;
    					mindis = d[k];
                    
                }
    		}
          
    		total+=mindis;
            d[ti]=0;
    		for(j=0;j<n;j++){
    		
    			if(d[j]&&dis[j][ti]<d[j])d[j]=dis[j][ti];
    		}
            
        }
        
    	
    	
    	
        return total;
    }
    int main(int argc, char* argv[])
    {
    	//freopen("i://t.txt","r",stdin);
    	int c,i,j,k;
    	while(scanf("%d",&c)&&c){
    	for(i=0;i<c;i++)
    	{
    		scanf("%s",types[i]);
    		for(j=0;j<i;j++){
    		int dif = 0;
    		for(k=0;k<7;k++)
    			if(types[j][k]!=types[i][k])dif++;
    
    		dis[i][j] = dis[j][i] = dif;
    		
    		}
    	}
    	printf("The highest possible quality is 1/%d.\n",prim(c));
    	}
    	
    	return 0;
    }
  • 相关阅读:
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
    望其项背 iOS
  • 原文地址:https://www.cnblogs.com/yangyh/p/2044677.html
Copyright © 2011-2022 走看看