还是最小生成树,kruskal模板搞定
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct VertexStruct
{
char name[21];
struct VertexStruct *parent;
int rank;
};
typedef struct VertexStruct *Vertex;
struct Edge
{
Vertex u;
Vertex v;
double d;
};
Vertex make_set(char *name)
{
Vertex v = malloc(sizeof(struct VertexStruct));
memcpy(v->name, name, strlen(name) + 1);
v->parent = v;
v->rank = 0;
return v;
}
void link(Vertex x, Vertex y)
{
if (x->rank > y->rank)
y->parent = x;
else
{
x->parent = y;
if (x->rank == y->rank)
y->rank++;
}
}
Vertex find_set(Vertex x)
{
if (x != x->parent)
x->parent = find_set(x->parent);
return x->parent;
}
void union_set(Vertex x, Vertex y)
{
link(find_set(x), find_set(y));
}
int cmp2326(const void *p1, const void *p2)
{
struct Edge *e1 = (struct Edge *) p1;
struct Edge *e2 = (struct Edge *) p2;
if (e1->d > e2->d)
return 1;
else if (e1->d < e2->d)
return -1;
else
return 0;
}
int main()
{
double length;
scanf("%lf", &length);
int n, m, i;
scanf("%d", &n);
Vertex *v_array = malloc(n * sizeof(Vertex));
for (i = 0; i < n; i++)
{
char s[21];
scanf("%s", s);
v_array[i] = make_set(s);
}
scanf("%d", &m);
struct Edge *e_array = malloc(m * sizeof(struct Edge));
for (i = 0; i < m; i++)
{
char s[21], t[21];
int j;
double d;
scanf("%s %s %lf", s, t, &d);
for (j = 0; j < n; j++)
{
if (strcmp(v_array[j]->name, s) == 0)
e_array[i].u = v_array[j];
if (strcmp(v_array[j]->name, t) == 0)
e_array[i].v = v_array[j];
}
e_array[i].d = d;
}
qsort(e_array, m, sizeof(struct Edge), cmp2326);
double res = 0;
for (i = 0; i < m; i++)
{
struct Edge *e = &e_array[i];
if (find_set(e->u) != find_set(e->v))
{
union_set(e->u, e->v);
res += e->d;
}
}
if (res > length)
printf("Not enough cable\n");
else
printf("Need %.1lf miles of cable", res);
for (i = 0; i < n; i++)
free(v_array[i]);
free(v_array);
free(e_array);
return 0;
}