题目大意:
你是SmallCableCo的主人并且买了一座小镇的特许权。不幸的是,你缺乏资金开始业务并且依赖你买的仓库的一部分。你找到的东西有一卷轴cable和大量连接器。你想知道你是否有足够的cable连接镇上的每个房子。你想计算连接所有房子最短的距离。
输入格式:
第一行给出cable的长度
第二行给出房子的数量N
接下来的N行给出每个房子的主人
接下来一行给出一个整数M
接下来M行给出路径和所需cable长度
解题思路:
最小生成树问题
代码如下:
#include < stdio.h>
#include < string.h>
#include < stdlib.h>
typedef struct
{
int h_1, h_2;
double d;
}EDGE;
EDGE edge[100000];
int father[300], rank[300];
char name[300][25];
double len_ness;
int cmp(const void *a, const void *b);
void link(int a, int b, double w);
int find_set(int x);
int main(void)
{
double len_cab, temp_dis;
int N, M, i, j;
char name_1[25], name_2[25];
while (scanf("%lf", &len_cab) != EOF)
{
len_ness = 0;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%s", name[i]);
father[i] = i;
rank[i] = 0;
}
scanf("%d", &M);
for (i = 0; i < M; i++)
{
scanf("%s%s%lf", name_1, name_2, &temp_dis);
for (j = 0; j < N; j++)
{
if (strcmp(name_1, name[j]) == 0) edge[i].h_1 = j;
if (strcmp(name_2, name[j]) == 0) edge[i].h_2 = j;
}
edge[i].d = temp_dis;
}
qsort(edge, M, sizeof(EDGE), cmp);
for (i = 0; i < M; i++)
if (find_set(edge[i].h_1) != find_set(edge[i].h_2))
link(edge[i].h_1, edge[i].h_2, edge[i].d);
if (len_cab >= len_ness)
printf("Need %.1lf miles of cable\n", len_ness);
else printf("Not enough cable\n");
}
return 0;
}
int cmp(const void *a, const void *b)
{
if ( ((EDGE *)a)->d > ((EDGE *)b)->d ) return 1;
return -1;
}
void link(int a, int b, double w)
{
int x, y;
x = find_set(a);
y = find_set(b);
if (rank[x] > rank[y])
{
rank[x]++;
father[y] = x;
}
else
{
rank[y]++;
father[x] = y;
}
len_ness += w;
}
int find_set(int x)
{
if (x != father[x]) return find_set(father[x]);
return x;
}
784

被折叠的 条评论
为什么被折叠?



