POJ1789 Truck History(prim)

本文介绍了一种利用Prim算法解决特定字符串距离问题的方法。通过计算字符串间的差异来构造图,并运用最小生成树算法找到所有字符串间差异总和的最小值。文章提供了完整的C++代码实现。

题目链接

分析:

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

每种代表车型的串,他们的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.\n", ans);
    }

    return 0;
}

 

 

转载于:https://www.cnblogs.com/tanhehe/p/3252417.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值