最小生成树。prim算法,因为是全相连的图,所以用O(V^2)的算法最快。。
POJ怎么又不能用STL的accumulate算法了。。
#include <iostream>
#include <stdlib.h>
#include <list>
#include <algorithm>
#include <string.h>
using namespace std;
int n;
int w[2000][2000];
int D[2000];
string V[2000];
list<int> L;
int dis(string &s1, string &s2){
int count = 0;
for(int i=0;i<s1.length();++i)
if(s1[i]!=s2[i])
++count;
return count;
}
bool cmp(int x,int y){ return D[x]<D[y];}
void process(){
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
w[i][j] = w[j][i] = dis(V[i],V[j]);
memcpy(D,w[0],sizeof(D));
D[0] = 0;
int i = n-1;
while(i>0)
L.push_back(i--);
list<int>::iterator it;
while(!L.empty()){
it = min_element(L.begin(),L.end(),cmp);
i = *it;
L.erase(it);
for(it=L.begin();it!=L.end();++it)
if(D[*it]>w[i][*it])
D[*it] = w[i][*it];
}
int res = 0;
for(i=1;i<n;++i)
res += D[i];
cout<<"The highest possible quality is 1/"<<res<<'.'<<endl;
}
int main(){
while(cin>>n,n!=0){
for(int i=0;i<n;++i)
cin>>V[i];
process();
}
return 0;
}