题目的意思就是用一个长度为7的字符串来代表车的编号
有n个车 每两辆车之间的距离定义为 字符串中不相同的字符的个数 一辆车是从另外一辆车继承而来的 问怎么继承会使得总的继承距离最小 由于每两辆车之间都有距离 要取得最小的总距离的话就是最小生成树 转化成图论的问题了!
http://poj.org/problem?id=1789
#include <iostream>
#define MAXN 2001
#define CODELEN 7
#define MAXINF 10000
using namespace std;
char inputstring[MAXN][CODELEN];
int graph[MAXN][MAXN];
int n;
void input(int num)
{
for (int i = 0; i < num; i++)
{
cin >> inputstring[i];
}
}
int computerDistance(char *s1, char *s2)
{
int differentnum = 0;
for (int i = 0; i < CODELEN; i++)
{
if (s1[i] != s2[i])
differentnum++;
}
return differentnum;
}
/*
使用prim算法求出最小生成树,并返回最小生成树的权值
*/
int prim(int num,int *visitorder)
{
bool *visited = new bool[num];
int result = 0;//最小生成树的权值
int *low = new int[num];//如果i没有被访问过,则low[i]代表 访问过的所有点中到i点的最小距离
int min;//存储pos 到其他的没有访问过的点的最小距离
int pos = 0;//搜索的开始位置
for (int i = 0; i < num; i++)
{
visited[i] = false;
}
for (int i = 0; i < num; i++)
{
low[i] = graph[pos][i];
}
visited[pos] = true;
visitorder[0] = pos;
for (int i = 0; i < num - 1; i++)//寻找其他Num-1个顶点
{
min = MAXINF;
for (int j = 0; j < num; j++)
{
if (!visited[j] && (min>low[j]))
{
min = low[j];
pos = j;
}
}
result += min;
visited[pos] = true;
visitorder[i + 1] = pos;
for (int j = 0; j < num; j++)
{
if(!visited[j]&&(low[j]>graph[pos][j]))
low[j] = graph[pos][j];
}
}
delete[] visited;
delete[] low;
return result;
}
int computer(int num)
{
/*
先计算出每个顶点和其他顶点的距离 用二维数组表示图
*/
for (int i = 0; i < num; i++)
for (int j = 0; j < num; j++)
{
if (i != j)
graph[i][j] = computerDistance(inputstring[i], inputstring[j]);
else
graph[i][j] = 0;
}
int *visitorder = new int[num];//用来记录点的访问次序
return prim(num, visitorder);
}
int main()
{
while (cin >> n, n)
{
input(n);
int mintotallen = computer(n);
cout << "The highest possible quality is 1/" << mintotallen << endl;
}
system("pause");
return 0;
}