Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 8270 | Accepted: 2970 |
Description
Today, ACM is rich enough to pay historians to study its history. One thing historians tried to find out is so called derivation plan -- i.e. how the truck types were derived. They defined the distance of truck types as the number of positions with different letters in truck type codes. They also assumed that each truck type was derived from exactly one other truck type (except for the first truck type which was not derived from any other type). The quality of a derivation plan was then defined as
1/Σ(to,td)d(to,td)Input
Output
Sample Input
4aaaaaaabaaaaaaabaaaaaaabaaaa0
Sample Output
The highest possible quality is 1/3.
解题思路: prim最小生成树,计算最小生成树的权值之和。
#include <iostream> #include <cstring> #include <cstdio> #define MAX_VALUE 1e8 using namespace std; char code[2000][7]; int map[2000][2000]; int d[2000]; bool visit[2000]; int main() { int N; int tmpdif; while(scanf("%d",&N) && N!=0) { //init memset(code,0,sizeof(code)); fill(d,d+N,MAX_VALUE); memset(visit,0,sizeof(visit)); for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { map[i][j]=MAX_VALUE; } } //input getchar(); for(int i=0; i<N; i++) { for(int j=0; j<7; j++) { scanf("%c",&code[i][j]); } getchar(); } for(int i=0; i<N; i++) { for(int j=i+1; j<N; j++) { tmpdif=0; for(int k=0; k<7;k++) { if(code[i][k]!=code[j][k]) { tmpdif++; } } if(tmpdif!=0) { map[i][j]=tmpdif; map[j][i]=tmpdif; } } } //prim int minNode, minValue; int q=0; d[0]=0; for(int i=0; i<N; i++) { minNode=0; minValue=MAX_VALUE; //extract minNode for(int j=0; j<N; j++) { if(!visit[j] && d[j]<minValue) { minValue=d[j]; minNode=j; } } q+=d[minNode]; visit[minNode]=true; for(int j=0; j<N; j++) { if(!visit[j]&&d[j]>map[minNode][j]) { d[j]=map[minNode][j]; } } } printf("The highest possible quality is 1/%d.\n",q); } return 0; }