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;
}


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