标签:
http://poj.org/problem?id=1789
题意:简单来说,就是给出一个 n 行的字符串, 字符串与字符串间的距离为它们相照应的比较有几个不同的字母, 然后求出 n 行字符串直接或间接相连中最短的距离为多少。(生成树模板)
写最小生成树的专题真的比之前其他专题感觉好多了。(%>_<%)
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> using namespace std; #define maxn 2510 #define oo 0x3f3f3f3f int maps[maxn][maxn], dist[maxn], v[maxn]; char str[maxn][maxn]; int n; void Init() { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(i==j) maps[i][j]=0; else maps[i][j] = maps[j][i]=oo; } } int solve(int p, int q) { int ans = 0; for(int i=0; str[p][i]; i++) if(str[p][i] != str[q][i]) ans ++; return ans; } void Dij() { memset(v, 0, sizeof(v)); int sum = 0; for(int i=1; i<=n; i++) dist[i] = maps[1][i]; v[1] = 1; for(int i=1; i<n; i++) { int index, mins=oo; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]<mins) { index = j; mins = dist[j]; } } sum+=mins; v[index] = 1; for(int j=1; j<=n; j++) { if(!v[j] && dist[j]>maps[index][j]) { dist[j] = maps[index][j]; } } } printf("The highest possible quality is 1/%d.\n", sum); } int main() { while(scanf("%d", &n), n) { for(int i=1; i<=n ;i++) scanf("%s", str[i]); Init(); for(int i=1; i<n; i++) { for(int j=i+1; j<=n; j++) maps[i][j] = maps[j][i] = min(solve(i, j), maps[i][j]); } Dij(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/daydayupacm/p/5695985.html