poj 1789 Truck History(最小生成树 prim)
题目:http://poj.org/problem?id=1789
大意:每个卡车都有自己的编号,由七位字母组成
d(to,td) is the distance of the types指t0 和 td卡车编号字母不同的个数,即点t0和点td的权
最好得衍生方案是是的总权值最小,即最小生成树
用的prim
View Code
#include <iostream> #include<cstdio> #include<cstring> #define inf 0x7fffffff using namespace std; char str[2005][7]; int map[2005][2005]; int n; int cmp(char *s1,char *s2) { int i,num=0; for(i=0;i<7;i++) { if(*(s1+i)!=*(s2+i)) num++; } return num; } void prim() { int vis[2005]; int dis[2005]; int i,j; memset(vis,0,sizeof(vis)); vis[0]=1; for(i=1;i<n;i++) { dis[i]=map[0][i]; } int min; int pos; int ans=0; for(i=0;i<n;i++) { min=inf; for(j=0;j<n;j++) { if(min>dis[j]&&!vis[j]) { pos=j; min=dis[j]; } } if(min==inf) break; ans+=min; vis[pos]=1; for(j=0;j<n;j++) { if(map[pos][j]<dis[j]&&!vis[j]&&map[pos][j]>0) { dis[j]=map[pos][j]; } } } printf("The highest possible quality is 1/%d.\n",ans); } int main() { int i,j; while(scanf("%d",&n)!=EOF) { if(n==0) break; getchar(); for(i=0;i<n;i++) { gets(str[i]); } memset(map,0,sizeof(map)); for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { map[i][j]=cmp(str[i],str[j]); map[j][i]=map[i][j]; } } prim(); } return 0; }