,,,原因是visited数组={0}开在了局部变量里.....但是还是不明白。。。。
#include <iostream>
#include <cstdio>
#include <climits>
const int N = 2000+25;
char s[N][N];
int m[N][N]={0};
int n;
using namespace std;
int Cont(int x, int y)
{
int c = 0;
for(int i = 0; i < 7; i++)
{
if(s[x][i] != s[y][i])
c++;
}
return c;
}
void Prim()
{
int pos = 0, sum = 0, Min;
int Visited[n], low[n];
//初始化
for(int i=0; i<n; i++){
low[i] = m[0][i];
Visited[i] = 0;
// cout << low[i] << endl;
}
Visited[0] = 1; //刚开始少了这个标记,结果会出错
for(int i=0; i<n-1; i++){//循环n-1次 因为之前low更新过一次
Min = INT_MAX;
// pos = -1;
for(int j=0; j<n; j++){
if(Min > low[j] && !Visited[j]){
pos = j;
Min = low[j];
// cout << "test:" <<low[j] << Min << endl;
// cout << pos << ":" << j << endl;
}
}
// cout << i << " " << Min << " " << sum << endl;
Visited[pos] = 1;//标记走过,,必须在外面,因为真正入的点才会被标记
sum += Min;
//更新
for(int j=0; j<n; j++){
if(!Visited[j] && low[j] > m[pos][j]){
low[j] = m[pos][j];
// cout << low[j] << " ";
}
// cout << low[j] << endl;
}
}
// cout << sum << endl;
printf("The highest possible quality is 1/%d.\n", sum);
}
int main()
{
while(cin >> n && n) {
for (int i = 0; i < n; i++) {
cin >> s[i];
}
for (int i = 0; i < n-1; i++) {
for (int j = i + 1; j < n; j++) {
m[i][j] = m[j][i] = Cont(i, j);
// cout << m[i][j] << endl;
}
}
Prim();
}
return 0;
}