标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 22648 | Accepted: 8781 |
Description
Input
Output
Sample Input
4 aaaaaaa baaaaaa abaaaaa aabaaaa 0
Sample Output
The highest possible quality is 1/3.
题意:每输入一个字符串代表一个节点,而节点之间的距离就是不同字符串字对应位置不同的字符个数,然后求最小生成树
不同题意的时候完全不知道怎么做,当知道是距离是什么和是求最小生成树的时候就成了水题
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 const int INF = 100000000; 8 int n; 9 char str[2000 + 10][10]; 10 int edge[2000 + 10][2000 + 10],dist[2000 + 10],vis[2000 + 10]; 11 int weight(char a[],char b[]) 12 { 13 int ans = 0; 14 for(int i = 0; i < 7; i++) 15 if(a[i] != b[i]) 16 ans ++; 17 return ans; 18 } 19 void prime() 20 { 21 memset(vis,0,sizeof(vis)); 22 for(int i = 2; i <= n; i++) 23 { 24 dist[i] = edge[1][i]; 25 } 26 vis[1] = 1; 27 dist[1] = 0; 28 int sum = 0; 29 for(int i = 1; i < n; i++) 30 { 31 int minn = INF,pos; 32 for(int j = 1; j <= n; j++) 33 { 34 if(vis[j] == 0 && dist[j] < minn) 35 { 36 minn = dist[j]; 37 pos = j; 38 } 39 } 40 sum += minn; 41 vis[pos] = 1; 42 for(int j = 1; j <= n; j++) 43 { 44 if(dist[j] > edge[pos][j]) 45 dist[j] = edge[pos][j]; 46 } 47 } 48 printf("The highest possible quality is 1/%d.\n",sum); 49 } 50 int main() 51 { 52 while(scanf("%d", &n) != EOF) 53 { 54 if(n == 0) 55 break; 56 for(int i = 1; i <= n; i++) 57 { 58 scanf("%s", str[i]); 59 } 60 for(int i = 1; i < n; i++) 61 { 62 for(int j = i + 1; j <= n; j++) 63 { 64 edge[i][j] = edge[j][i] = weight(str[i],str[j]); 65 } 66 } 67 prime(); 68 } 69 return 0; 70 }
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/4985423.html