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
求保持森林中每个村子都有道路相通,且维修所需要的最少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
相关文章推荐
- poj&nbsp;1861&nbsp;network&nbsp;(kruskal)
- hdu 1301 Jungle Roads &&poj 1251 (prim 或者kruskal)
- poj 1251
- NYOJ 434 && poj 1251 最小生成树 Kruskal
- poj&nbsp;1679&nbsp;The&nbsp;Unique&nbsp;MST(kruskal)
- poj 1251 Jungle Roads【prim & kruskal】
- poj&nbsp;1251&nbsp;Jungle&nbsp;Roads&nbsp;最小生成树
- poj 1804 (归并排序求逆序数)Bra…
- poj 2960 sg函数
- poj&nbsp;1258&nbsp;Agri-Net(prim)
- poj&nbsp;1201&nbsp;Intervals&nbsp;(差分约束)
- poj&nbsp;2762&nbsp;Going&nbsp;from&nbsp;u&nbsp;to&nbsp;v&nbsp;or&nbsp;fr…
- poj&nbsp;1958&nbsp;Strange&nbsp;Towers&nbsp;of&nbsp;Hanoi…
- poj&nbsp;3342&nbsp;Party&nbsp;at&nbsp;Hali-Bula&nbsp;(树…
- poj&nbsp;3275&nbsp;Ranking&nbsp;the&nbsp;Cows(floyd&nbsp;…
- poj&nbsp;3013&nbsp;Big&nbsp;Christmas&nbsp;Tree&nbsp;(解…
- poj 2777 Count Color
- POJ&nbsp;1929
- poj 1035
- POJ 2739 Sum of Consecutive Prim…