今天可算步入正轨了。
开始接触最小生成树算法之prim,通过大佬的博客学习了一番。
练手的题目是POJ_1789,但是我太弱了,还是自己做不出来(其实题目也没看懂)。
转载自:https://www.cnblogs.com/lyy289065406/archive/2011/07/30/2121711.html
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf = 10;
const int large = 2001;
int n;
char str[large][8];
int dist[large][large] = { 0 };
int weight(int i, int j) {
int w = 0;
for(int k = 0; k < 7; k++)
if(str[i][k] != str[j][k])
w++;
return w;
}
int prim() {
int s = 1;
int m = 1;
bool u[large];
int prim_w = 0;
int min_w;
int flag_point;
int low_dis[large];
memset(low_dis, inf, sizeof(low_dis));
memset(u, false, sizeof(u));
u[s] = true;
while(1) {
if(m == n)
break;
min_w = inf;
for(int j = 2; j <= n; j++) {
if(!u[j] && low_dis[j] > dist[s][j])
low_dis[j] = dist[s][j];
if(!u[j] && min_w > low_dis[j]) {
min_w = low_dis[j];
flag_point = j;
}
}
s = flag_point;
u[s] = true;
prim_w += min_w;
m++;
}
return prim_w;
}
int main() {
//freopen("in.txt", "r", stdin);
int i,j;
while(cin >> n && n) {
for(i = 1; i <= n; i++)
cin >> str[i];
for(i = 1; i <= n-1; i++)
for(j = i+1; j <= n; j++)
dist[i][j] = dist[j][i] = weight(i,j);
cout << "The highest possible quality is 1/" << prim() << "." << endl;
}
return 0;
}