【prim算法】poj1789
题目:http://poj.org/problem?id=1789
思路
求这些字符串的继承关系图,要求这些字符串的海明距离最小,其实就是最小生成树.
或者换一种思路就是,将这些串都转换为同一个串,最少需要修改几个字符,实际也是最小生成树算法
代码
#define INTMAX 0x3f3f3f3f
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int num_v;
int w[2005][2005];
int dist[2005];
int result;
int calweight(string &a,string&b)
{
int ret=0;
for(int i=0;i<a.size();i++)
{
if(a[i]!=b[i])
ret++;
}
return ret;
}
bool myless(int a,int b){return dist[a]<dist[b];}
void prim()
{
vector<int> Q(num_v);
vector<bool> inQ(num_v,true);
for(int i=0;i<num_v;i++)Q[i]=i;
dist[0]=0;
while(Q.size())
{
vector<int>::iterator p=min_element(Q.begin(),Q.end(),myless);
int v=*p;
//cout<<dist[v]<<endl;
inQ[v]=false;
result+=dist[v];
Q.erase(p);
for(int i=0;i<num_v;i++)
{
if(inQ[i] && w[v][i] <dist[i])
dist[i]=w[v][i];
}
}
}
int main()
{
while(cin>>num_v)
{
if(num_v==0)
break;
memset(w,0x3f,sizeof(w));
memset(dist,0x3f,sizeof(dist));
result=0;
vector<string> strs(num_v);
for(int i=0;i<num_v;i++)cin>>strs[i];
for(int i=0;i<num_v;i++)
for(int j=0;j<num_v;j++)
w[i][j]=calweight(strs[i],strs[j]);
prim();
cout<<"The highest possible quality is 1/"<<result<<".\n";
}
return 0;
}