poj 1789 trucks 最小生成树

题意:给出n个长度为7的字符串,每个字符串代表一个车,定义车的距离是两个字符串间不同字母的个数,题目要求的数不同的车的距离的最小值,即所求的就是最小生成树

注意cin 会超时

#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
#define IN (1<<28)
using namespace std;
int kase,N;
int G[2005][2005];
int locost[2005], visited[2005];
int cost;
char trucks[2005][7];
void prime()
{
    for( int i = 1; i <= N; i++ )
        locost[i] = G[1][i];
    locost[1] = 0;
    visited[1] = 1;
    int cnt = 0;
    while( cnt != N - 1 )
    {
        int MinV = 0, Min = IN;
        for( int i = 1; i <= N; i++ )
            if( locost[i] && locost[i] < Min )
            {
                MinV = i;
                Min = locost[i];
            }
        if( !MinV )
            break;
        cost += Min;
        cnt++;
        locost[MinV] = 0;
        for( int i = 1; i <= N; i++ )
        {
            if( locost[i] && locost[i] > G[MinV][i] )
                locost[i] = G[MinV][i];
        }
    }
}
int dis( char * a, char * b )
{
    int distance = 0;
    for( int i = 0; i < 7; i++ )
    {
        if( a[i] != b[i] )
            distance++;
    }
    return distance;
}
int main()
{
    while( cin >> N, N)
    {
        for( int i = 1; i <= N; i++ )
            scanf("%s", trucks[i] );
        for( int i = 1; i <= N; i++ )
            for( int j = 1; j <= N; j++ )
            {
                G[i][j] = dis( trucks[i], trucks[j] );
            }
        memset( locost, 0, sizeof(locost) );
        memset( visited, 0, sizeof(visited) );
        cost = 0;
        prime();
        printf("The highest possible quality is %d/%d.\n", 1, cost);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xutian_curry/article/details/80226627
今日推荐