这题是prim的水题。。。
注意:
1.读懂题,读了好半天,明白是啥意思
2.注意数据范围,map[2001][2001]必须放在堆里面。。。否则RUNTIME error
代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAX 8
#define MAX_SIZE_OF_VEXS 2001
using namespace std;
typedef struct
{
int vexs[MAX_SIZE_OF_VEXS];
int arcs[MAX_SIZE_OF_VEXS][MAX_SIZE_OF_VEXS];
int vex_num;
int arc_num;
}graph;
typedef struct
{
int lowcast;
int adjvex;
}cl;
char* s[2001];
graph g;
cl close[MAX_SIZE_OF_VEXS];
int prim(int u)
{
int sum = 0;
for(int i = 1;i <= g.vex_num; i++)
{
close[i].adjvex = u;
close[i].lowcast = g.arcs[i][u];
}
for(int q = 1;q <= g.vex_num-1; q++)
{
int min = MAX,k;
for(int j = 1;j <= g.vex_num;j++)
{
if(close[j].lowcast>0 && min > close[j].lowcast)
{
k = j;
min = close[j].lowcast;
}
}
close[k].lowcast = 0;
sum += g.arcs[(close[k].adjvex)][k];
for(int j = 1; j <= g.vex_num; j++)
{
if(close[j].lowcast > g.arcs[j][k])
{
close[j].lowcast = g.arcs[j][k];
close[j].adjvex = k;
}
}
}
return sum;
}
int comp(char* s,char* r)
{
int sum = 0;
for(int i = 0;i <= 6;i++)
{
if(s[i] != r[i]) sum++;
}
return sum;
}
int main()
{
while(cin>>g.vex_num && g.vex_num)
{
for(int i = 1;i <= g.vex_num;i++)
{
s[i] = (char*)malloc(sizeof(char)*10);
cin>>s[i];
}
for(int i = 1;i <= g.vex_num; i++)
for(int j = i;j <= g.vex_num; j++)
g.arcs[i][j] = g.arcs[j][i] = (i == j)?0:comp(s[i],s[j]);
cout<<"The highest possible quality is 1/"<<prim(1)<<".\n";
}
return 0;
}