您的位置:首页 > 其它

poj 1789 Truck History(最小生成树 prim)

2012-12-03 20:46 447 查看
题目:http://poj.org/problem?id=1789

大意:每个卡车都有自己的编号,由七位字母组成

d(to,td) is the distance of the types指t0 和 td卡车编号字母不同的个数,即点t0和点td的权

最好得衍生方案是是的总权值最小,即最小生成树

用的prim

View Code

#include <iostream>
#include<cstdio>
#include<cstring>
#define inf 0x7fffffff
using namespace std;
char str[2005][7];
int map[2005][2005];
int n;
int cmp(char *s1,char *s2)
{
int i,num=0;
for(i=0;i<7;i++)
{
if(*(s1+i)!=*(s2+i))
num++;
}
return num;
}
void prim()
{
int vis[2005];
int dis[2005];
int i,j;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(i=1;i<n;i++)
{
dis[i]=map[0][i];
}
int min;
int pos;
int ans=0;
for(i=0;i<n;i++)
{
min=inf;
for(j=0;j<n;j++)
{
if(min>dis[j]&&!vis[j])
{
pos=j;
min=dis[j];
}
}
if(min==inf)
break;
ans+=min;
vis[pos]=1;
for(j=0;j<n;j++)
{
if(map[pos][j]<dis[j]&&!vis[j]&&map[pos][j]>0)
{
dis[j]=map[pos][j];
}
}
}
printf("The highest possible quality is 1/%d.\n",ans);
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
getchar();
for(i=0;i<n;i++)
{
gets(str[i]);
}
memset(map,0,sizeof(map));
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
map[i][j]=cmp(str[i],str[j]);
map[j][i]=map[i][j];
}
}
prim();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: