您的位置:首页 > 其它

poj 1251_kruskal

2013-05-02 10:23 381 查看
题目描述:

求保持森林中每个村子都有道路相通,且维修所需要的最少money。

解题思路:

水题。kruskal,最小生成树问题。和原算法没神马出入。输入的时候注意下就好了(用scanf("%s")省点劲)。

代码:

#include <stdio.h>

#include <stdlib.h>

#define N 100

typedef struct{

   int s;

   int e;

   int weight;

}ROAD;

ROAD roads
;

int set
;

int partition(int low, int high)

{

   ROAD tmp = roads[low];

  
while(low<high)

   {

     
while(low<high &&
roads[high].weight >= tmp.weight)

        
high --;

     
if(low < high)

        
roads[low++] = roads[high];

     
while(low < high &&
roads[low].weight <= tmp.weight)

        
low ++;

     
if(low < high)

        
roads[high--] = roads[low];

   }

   roads[low] = tmp;

   return low;

}

void sort(int low, int high)

{

   int index;

   if(low <
high)

   {

       
index = partition(low, high);

       
sort(low,index-1);

       
sort(index+1,high);

   }

}

int find_set(int i)

{

   if(set[i]!=i)

     
set[i] = find_set(set[i]);

   return set[i];

}

void union_set(int i, int j)

{

   int i1 = find_set(i);

   int j1 = find_set(j);

   set[i1] = set[j1];

}

main()

{

   int n,len,r,sum,i,j,k;

   char src[10],end[10];

  

  
scanf("%d",&n);

   while(n!=0)

   {

      
r = 1;

      
sum = 0;

      
for(i=1;i<n;i++)

      
{

         
scanf("%s%d",src,&k);

         
for(j=1;j<=k;j++)

         
{

            
scanf("%s%d",end, &len);

            
roads[r].s = src[0] - 'A'+1;

            
roads[r].e = end[0] - 'A'+1;

            
roads[r++].weight = len;

         
}

      
}

      
len = r-1;// len条路径

      
sort(1,len);

      
//make set
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: