这道题目,用前面的prim算法,就会超时,所以需要寻找更加高性能的prim算法,包括
1.string输入的优化
2.去掉vector<int>
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include <cstdlib>
- using namespace std;
- const int MAX = 2001;
- const int INF = 100;
- int c[MAX][MAX];
- int closet[MAX];//记录的是V-U集合连接到U集合中,最小的边,包含在U中的顶点
- int lowcost[MAX];
- char ss[MAX][7];
- bool flag[MAX];
- int Prim(int n)
- {
- int i, j, k, ans = 0, pair = 0;
- flag[1] = true;
- for(i = 2; i <= n; i++)
- {
- lowcost[i] = c[1][i];
- closet[i] = 1;
- flag[i] = false;
- }
- for(i = 1; i < n; i++)
- {
- j = 1;
- int min = INF;
- //遍历V-U集合,找到最小的lowcost
- for(k = 2; k <=n; k++)
- {
- if(lowcost[k] < min && !flag[k])
- {
- min = lowcost[k];
- j = k;
- }
- }
- flag[j] = true;
- //j<--->closet[j]表示新加入的这条边的长度
- ans += c[j][closet[j]];
- //重新计算V-U集合 到 U集合之间的 lowcost
- for(k = 2; k <= n; k++)
- {
- if(c[j][k] < lowcost[k] && !flag[k])
- {
- lowcost[k] = c[j][k];
- //为以后加入到U集合预先准备 k<--->closet[k]表示新加入的一条边
- closet[k] = j;
- }
- }
- }
- return ans;
- }
- int getDist(char* s1,char* s2) {
- int count = 0;
- for(int i=0;i<7;i++) {
- if(s1[i]!=s2[i])
- count++;
- }
- return count;
- }
- int main() {
- int i, j, n, m;
- cin>>n;
- while(n!=0) {
- for(i = 1; i <= n; i++)
- {
- //ss[i] = (char *)malloc(7);
- scanf("%s",&ss[i]);
- }
- for(i=1;i<=n;i++)
- for(j=i+1;j<=n;j++) {
- int dd = getDist(ss[i],ss[j]);
- c[i][j] = dd;
- c[j][i] = dd;
- }
- cout<<"The highest possible quality is 1/"<<Prim(n)<<"."<<endl;
- memset(flag,0,sizeof(flag));
- memset(closet,0,sizeof(closet));
- memset(lowcost,0,sizeof(lowcost));
- cin>>n;
- }
- return 0;
- }