链接:Truck History - POJ 1789 - Virtual Judge https://vjudge.net/problem/POJ-1789
题意:先给出一个n,代表接下来字符串的个数,接下来n个字符串,每个字符串长度为7,没有完全相同的字符串,字符串之间的距离是两个字符串里不同字符的个数(相同位置两两对比),然后求出从某个点到其他点距离和的最小值(分子一直是1,Q越小,1/Q越大),其实就是叫我们求出最小生成树,先字符串两两相比建图,然后求最小生成树。
#include<iostream> #include<cstring> #include<algorithm> #include<map> using namespace std; #define MAXN 2005 #define INF 0x3f3f3f char str[MAXN][8]; int edge[MAXN][MAXN]; int vis[MAXN],dis[MAXN]; int n,m,k,t,ans; int dist(int a,int b) { int ans=0; for(int i=0;i<7;i++) { if(str[a][i]!=str[b][i]) ans++; } return ans; } void build() //建图 { memset(edge,0x3f,sizeof(edge)); for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { edge[i][j]=edge[j][i]=dist(i,j); } } } void prime() //套模板的 { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) dis[i]=edge[i][0]; vis[0]=1; for(int i=0;i<n-1;i++) { int min1=INF,u=-1; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]<min1) { min1=dis[j]; u=j; } } if(u==-1) return; vis[u]=1; ans+=min1; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]>edge[u][j]) dis[j]=edge[u][j]; } } } int main() { while((cin>>n)&&n) { for(int i=0;i<n;i++) cin>>str[i]; build(); //建图 ans=0; prime(); cout<<"The highest possible quality is 1/"<<ans<<'.'<<endl; } return 0; }