您的位置:首页 > 其它

POJ1789 Truck History【最小生成树】【终于AC了】

2012-04-14 12:40 465 查看
这道题提交了N次,终于AC了,哪里错了呢???我一直找代码的错误。后来错误原因让我大吃一惊:我误以为题目中每一个case后都有一个0的,原来是全部case后边有一个0。。。。。

Problem: 1789User: qq1203456195
Memory: 15892KTime: 485MS
Language: CResult: Accepted
#include <stdio.h>
#include <string.h>
#define N 2002

int n;//number of truck 2..2000
char truck
[7];//different types of truck
int M

;//distance between 2 trucks
int lowcost
;//辅助数组
int visited
;//记录是否被放进最小生成树中
int dis(int i,int j)//计算i,j类truck的不同
{
int k,c=0;
for (k=0;k<7;k++)
if(truck[i][k]!=truck[j][k])
c++;
return c;
}
int min_lowcost(int *m)
{
int i,t;
for (i=0;i<n;i++)
if (!visited[i]&&lowcost[i]<(*m))
{
t=i;
(*m)=lowcost[i];
}
return t;
}
int Prim()
{
int i,mindis=0,next_idx,j,next_len;

for (i=0;i<n;i++)
{
visited[i]=0;
lowcost[i]=M[0][i];//和衍生图中距离最近的那个点的距离
}
visited[0]=1;
for (i=1;i<n;i++)//将其余n-1辆车放入衍生图
{
next_len=8;
next_idx=min_lowcost(&next_len);//找出花费最小的车next
mindis+=next_len;//最小生成树累加
visited[next_idx]=1;//添加到衍生图
for (j=0;j<n;j++)//更新辅助数组
{
if(!visited[j]&&M[next_idx][j]<lowcost[j])
lowcost[j]=M[next_idx][j];
}
}
return mindis;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
if (n==0)    break;
//read info
memset(truck,0,sizeof(truck));
for (i=0;i<n;i++)
scanf("%s",truck[i]);
//init Metric
memset(M,8,sizeof(M));
for (i=0;i<n;i++)
for (j=i+1;j<n;j++)
M[i][j]=M[j][i]=dis(i,j);
//output result
printf("The highest possible quality is 1/%d.\n",Prim());
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: