ZOJ-2281

来源:互联网 发布:java 引用其他文件 编辑:程序博客网 时间:2024/05/24 07:31

边排序加并查集。。很早以前就做过一直WA就放弃了,今天看到了就又重写了一遍,参考了大神的代码发现是没有考虑两点不连通的情况,这种情况应该输出0,我晕死==b ,当初肯定是这个原因WA的

#include<stdio.h>#include<stdlib.h>struct RoomStruct{struct RoomStruct *parent;int rank;};typedef struct RoomStruct *Room;struct Edge{Room a;Room b;int weight;};static int cmp(const void *p1, const void *p2){struct Edge *e1 = (struct Edge*) p1;struct Edge *e2 = (struct Edge*) p2;return e2->weight - e1->weight;}static Room make_set(){Room room = malloc(sizeof(struct RoomStruct));room->parent = room;room->rank = 1;return room;}static Room find_set(Room room){if (room->parent != room)room->parent = find_set(room->parent);return room->parent;}static void link(Room s1, Room s2){if (s1->rank > s2->rank)s2->parent = s1;else{s1->parent = s2;if (s1->rank == s2->rank)s2->rank++;}}static void union_set(Room s1, Room s2){link(find_set(s1), find_set(s2));}int main(){int n, m;while (scanf("%d %d", &n, &m) != EOF){Room *array = malloc(n * sizeof(Room));int i, u, v, w, x, y;for (i = 0; i < n; i++)array[i] = make_set();struct Edge *earray = malloc(m * sizeof(struct Edge));for (i = 0; i < m; i++){scanf("%d %d %d", &u, &v, &w);earray[i].a = array[u - 1];earray[i].b = array[v - 1];earray[i].weight = w;}scanf("%d %d", &x, &y);qsort(earray, m, sizeof(struct Edge), cmp);for (i = 0; i < m; i++){Room r1 = find_set(earray[i].a);Room r2 = find_set(earray[i].b);if (r1 != r2)union_set(r1, r2);if (find_set(array[x - 1]) == find_set(array[y - 1])){printf("%d\n", earray[i].weight);break;}}if (i == m)puts("0");free(earray);for (i = 0; i < n; i++)free(array[i]);free(array);}return 0;}


0 0
原创粉丝点击