Truck History POJ - 1789
考察:最小生成树
这道题难就难在怎么转成最小生成树的模型.本蒟蒻是看了别人的博客看着看着突然顿悟..(本蒟蒻不配)
正确思路:
字符串相互转化成相同的字符串.不同的字符串之间的字母差距其实就是这个字符串到不同的字符串的距离.明白之后直接套模板
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int N = 2010; 6 char s[N][8]; 7 int n,p[N]; 8 struct Edge{ 9 int a,b,w; 10 bool operator<(const Edge& x)const{ 11 return this->w<x.w; 12 } 13 }edge[N*N]; 14 int findf(int x) 15 { 16 if(x!=p[x]) p[x] = findf(p[x]); 17 return p[x]; 18 } 19 int main() 20 { 21 while(scanf("%d",&n)&&n) 22 { 23 int t = 0,res = 0; 24 for(int i=0;i<n;i++) p[i] = i; 25 for(int i=0;i<n;i++) 26 scanf("%s",s[i]); 27 for(int i=0;i<n;i++){ 28 for(int j=i+1;j<n;j++){ 29 int cnt = 0; 30 for(int k=0;k<7;k++){ 31 if(s[i][k]!=s[j][k]) cnt++; 32 } 33 edge[t++] = {i,j,cnt}; 34 } 35 } 36 sort(edge,edge+t); 37 for(int i=0;i<t;i++){ 38 int s = edge[i].a,e = edge[i].b; 39 s = findf(s); e = findf(e); 40 if(s!=e){ 41 res+=edge[i].w; 42 p[s]=e; 43 } 44 } 45 printf("The highest possible quality is 1/%d.\n",res); 46 } 47 return 0; 48 }