题目链接。
分析:
最大的敌人果然不是别人,就是她(英语)。
每种代表车型的串,他们的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; }
本文介绍了一种利用Prim算法解决特定字符串距离问题的方法。通过计算字符串间的差异来构造图,并运用最小生成树算法找到所有字符串间差异总和的最小值。文章提供了完整的C++代码实现。
292

被折叠的 条评论
为什么被折叠?



