poj 1789 最小生成树

1A,在POJ上好久没有1A了。。

算法:

裸的最小生成树,关键时认真读懂题意。

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

struct node
{
  int a, b, num;
  bool operator < ( const node& A) const
  {
    return num < A.num;
  }
}edge[4100000];

char truck[2100][10];
int N, e, set[2100];


int Dif( char *str, char *sts)
{
   int num = 0;
   for( int i = 0; i < 7; i++)
      if( str[i] != sts[i] )
         num++;
    return num; 
}

int find( int x )
{
  return x == set[x] ? x : set[x] = find(set[x]);
}

void merge( int x, int y)
{
   set[x] = y;
}

void Krusal( )
{
  int sum = 0;
  sort( edge, edge + e);
  for( int i = 0; i < e; i++)
  {
     int x = find(edge[i].a);
     int y = find(edge[i].b);
     if( x != y )
     {
        merge(x, y);
        sum += edge[i].num;
     }
  }
  printf("The highest possible quality is 1/%d.\n",sum);

}

int main( )
{
  while( scanf("%d",&N), N)
  {
    e = 0;
    for( int i = 1; i <= N; i++)
    { 
        scanf("%s",truck[i]);
        set[i] = i;
    }
    for( int i = 1; i <= N; i++)
    {
       for( int j = i + 1; j <= N; j++)
       {
           int x = Dif(truck[i], truck[j]);
           edge[e].a = i;
           edge[e].b = j;
           edge[e++].num = x;

       }
    }
    Krusal();
  }
  return 0;
}

posted on 2012-07-12 09:33  more think, more gains  阅读(142)  评论(0编辑  收藏  举报

导航