poj 1789 (最小生成树)

题意:给出n个卡车,每个卡车的类型是七个字符组成的,一种卡车可以从另一种卡车派生来的,代价是两种卡车间类型不同字符的个数,求出这n中卡车派生的最小代价,n种车有一 种是开始就有的,n-1种是派生出来的。

思路:因为刚开始有一种卡车,所以就是加n-1条把所有车连起来,就是最小生成树了。。




#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int N=2010;
char str[N][10];
int num,f[N];
struct edge
{
	int st,ed,w;
}e[N*N];
void addedge(int x,int y,int w)
{
	e[num].st=x;e[num].ed=y;e[num].w=w;num++;
}
int cmp(void const *a,void const *b)
{
	edge *c,*d;
	c=(edge *)a;
	d=(edge *)b;
	return c->w-d->w;
}
int dis(int i,int j)
{
	int k,sum=0;
	for(k=0;k<7;k++)
	{
		if(str[i][k]!=str[j][k])
			sum++;
	}
	return sum;
}
int find(int a)
{
	if(a!=f[a])
		f[a]=find(f[a]);
	return f[a];
}
int main()
{
	int i,j,n,x,y,sum;
	while(scanf("%d",&n)!=-1&&n)
	{
		num=0;
		for(i=1;i<=n;i++)
		{
			scanf("%s",str[i]);
			for(j=1;j<i;j++)
			{
				addedge(i,j,dis(i,j));
			}
			f[i]=i;
		}
		qsort(e,num,sizeof(e[0]),cmp);
		j=1;sum=0;
		for(i=0;i<num&&j<n;i++)
		{
			x=find(e[i].st);
			y=find(e[i].ed);
			if(x==y)continue;
			f[x]=find(y);
			sum+=e[i].w;
			j++;
		}
		printf("The highest possible quality is 1/%d.\n",sum);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章