poj 1789 Truck History

wa了一次,因为把结果输出时没有输出 ".",很活该。prim算法求最小生成树,不过不需要保存边,只需要把最小的分母几下就是了。

代码如下:

/*
Poj: 1789 Truck History
*/
#include <iostream>
#include <cstdio>
#include <cstring>

#define MaxDiff 1000
#define MaxP 2005

using namespace std;

char str[MaxP][8];
int dis[MaxP];
int n;
bool isIn[MaxP];

int CalDis(int i, int j);
int Prim();

int main()
{
    //freopen("data.in", "rb", stdin);
    while(scanf("%d", &n) != EOF && n != 0) {
        for(int i = 0; i < n; i++) {
            scanf("%s", str[i]);
        }
        
        memset(dis, 0, sizeof(dis));
        
        printf("The highest possible quality is 1/%d.\n", Prim());
    }
        
    return 0;
}

int CalDis(int i, int j)
{
    int t = 0;
    
    for(int k = 0; k < 7; k++) {
        if(str[i][k] != str[j][k]) {
            t++;
        }
    }
    
    return t;
}

int Prim()
{
    int shortest = 0;
    
    for(int i = 1; i < n; i++) {
        isIn[i] = false;
    }
    isIn[0] = true;
    
    for(int j = 1; j < n; j++) {
        dis[j] = CalDis(0, j);
    }
      
    for(int i = 0; i < n - 1; i++) {
        int tmp = MaxDiff;
        int tmp_index = 0;
        for(int j = 0; j < n; j++) {
            if(!isIn[j] && dis[j] < tmp) {
                tmp_index = j;
                tmp = dis[j];
            }
        }
        isIn[tmp_index] = true;
        shortest += tmp;
        for(int k = 0; k < n; k++) {
            if(!isIn[k] && dis[k] > CalDis(k, tmp_index))
                dis[k] = CalDis(k, tmp_index);
        }
    }

    return shortest;
}


你可能感兴趣的:(poj 1789 Truck History)