POJ1789 Truck History(prim)

题目链接

分析:

最大的敌人果然不是别人,就是她(英语)。

每种代表车型的串,他们的distance就是串中不同字符的个数,要求算出所有串的distance's 最小 sum。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int maxn = 2200;
const int INF = (1<<29);

char s[maxn][10];
unsigned short G[maxn][maxn];
bool vis[maxn];
int d[maxn], n;

int dis(int i, int j) {
    char *p1 = *(s+i), *p2 = *(s+j);
    int cnt = 0;

    while(*p1 && *p2) {
        if(*p1++ != *p2++) cnt++;
    }

    return cnt;
}

int prim(int s) {
    int ans = 0;

    memset(vis, false, sizeof(vis));

    for(int i=0; i<n; i++) d[i] = G[s][i];
    d[s] = 0; vis[s] = true;

    for(int i=0; i<n-1; i++) {
        int x, m = INF;
        for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
        ans += m;
        vis[x] = true;
        for(int y=0; y<n; y++) if(!vis[y] && d[y] > G[x][y]) d[y] = G[x][y];
    }

    return ans;
}

int main() {

    while(scanf("%d", &n) == 1 && n != 0) {
        for(int i=0; i<n; i++) {
            scanf("%s", s[i]);
        }

        for(int i=0; i<n; i++) {
            G[i][i] = 0;
            for(int j=0; j<i; j++) {
                G[i][j] = G[j][i] = dis(i, j);
            }
        }

        int ans = prim(0);
        printf("The highest possible quality is 1/%d.
", ans);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/3252417.html