题意说明:
输入若干个case,每个case的数字n代表有若干个车型,每个车型用7位的字符串表示,它们存在衍生关系,即c车型可能从b车型衍生出来也可能是从a车型衍生出来的。每两个车型存在一个distance值,且定义distance<a,b>=a车型和b车型在这7个字符中有多少个不一样,求哪一种衍生方案会使得总distances值最小。
建模:
将每一种车型看做是图G上一点,两点的权值就是两种车型的distance值,求该图的最小生成树MST。MST的权值就是总代价和。
#include<iostream>
#include<fstream>
using namespace std;
#define MAX 20001
#define MAXCOST 0x7fffffff
char ttypes[2001][7];
int graph[MAX][MAX];
int prim(int graph[][MAX], int n)
{
int lowcost[MAX];
int mst[MAX];
int i, j, min, minid, sum = 0;
for (i = 2; i <= n; i++)
{
lowcost[i] = graph[1][i];
mst[i] = 1;
}
mst[1] = 0;
for (i = 2; i <= n; i++)
{
min = MAXCOST;
minid = 0;
for (j = 2; j <= n; j++)
{
if (lowcost[j] < min && lowcost[j] != 0)
{
min = lowcost[j];
minid = j;
}
}
//cout << "V" << mst[minid] << "-V" << minid << "=" << min << endl;
sum += min;
lowcost[minid] = 0;
for (j = 2; j <= n; j++)
{
if (graph[minid][j] < lowcost[j])
{
lowcost[j] = graph[minid][j];
mst[j] = minid;
}
}
}
return sum;
}
int calcValue(char a[],char b[])
{
int value=0;
for (int i = 0; i < 7; i++)
{
if (a[i] != b[i])
{
value++;
}
}
return value;
}
int main()
{
int n,cost;
//ifstream in("input.txt");
while (cin >> n && n != 0)
{
//init graph
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
graph[i][j] = MAXCOST;
}
}
//input
for (int i = 1; i <= n; i++)
{
cin >> ttypes[i];
}
//construct graph
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
graph[i][j] = calcValue(ttypes[i],ttypes[j]);
}
}
cost = prim(graph,n);
cout << "The highest possible quality is " << 1 << "/" << cost <<"."<< endl;
}
//system("pause");
return 0;
}