poj 1789_prim

来源:互联网 发布:java通过ip获取地区 编辑:程序博客网 时间:2024/06/16 13:42

题目描述:

   字符串看做点,字符串之间距离(不同字符的个数)看做边权。求1/最小生成树值。

解题思路:

  水题。就是求最小生成树。这里面应该是点数明显少于边数的,所以选prim。

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 2001
#define Infinity 7

char input[N][8];
int G[N][N];
int visit[N], D[N];

int dis(int i, int j)
{
   int k, sum=0;
   if(i == j)
     return 0;
  for(k=0;k<7;k++)
    if(input[i][k] != input[j][k])
       sum++;
   return sum;
}
main()
{
   int n,i,j,min,pos,sum;
  scanf("%d",&n);
   while(n!=0)
   {
     // get input
     for(i=1;i<=n;i++)
        scanf("%s",input[i]);

     for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
           if(i != j)
              G[i][j] = dis(i, j);

     for(i=1;i<=n;i++)
     {
        visit[i] = 0;
        D[i] = Infinity;
     }
     
     visit[1] = 1;
     for(i=2;i<=n;i++)
        D[i] = G[1][i];
     
     //prim
     sum = 0;
     for(j=2;j<=n;j++)
     {
        min = Infinity;
        for(i=2;i<=n;i++)
           if(!visit[i] && D[i]<= min)
           {
              min = D[i];
              pos = i;
           }
        sum += min;
        visit[pos] = 1;
        //update
        for(i=2;i<=n;i++)
           if(!visit[i] && G[pos][i]< D[i])
              D[i] = G[pos][i];
     }
     printf("The highest possible quality is 1/%d.\n",sum);
     scanf("%d",&n);
   }
  
   //system("pause");
   return 0;
}

原创粉丝点击