/* Contest : Ulm Local Contest 1997 * Problem F : Frogger * Method : Kruskal Algorithm * Complexity : O(n^2 log n) * Author : Mark Dettinger * Date : June 13, 1997 */ #include #include #include #include #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define SQR(x) ((x)*(x)) #define MAXSTONES 500 typedef struct { int u,v,w; } edge; FILE *input; int scenario=0; int n; int x[MAXSTONES],y[MAXSTONES]; edge e[MAXSTONES*MAXSTONES]; /* ----- Data Structures and Algorithms for Disjoint Sets ------------------------- */ int rank[MAXSTONES],p[MAXSTONES]; void make_set (int x) { p[x] = x; rank[x] = 0; } int find_set (int x) { if (x!=p[x]) p[x] = find_set(p[x]); return p[x]; } void link (int x, int y) { if (rank[x]>rank[y]) { p[y] = x; } else { p[x] = y; if (rank[x]==rank[y]) rank[y]++; } } int same_set (int x, int y) { return find_set(x)==find_set(y); } void union_sets (int x, int y) { if (!same_set(x,y)) link(find_set(x),find_set(y)); } /* -------------------------------------------------------------------------------- */ int edgecmp (const void* a, const void* b) { return ((edge*)a)->w - ((edge*)b)->w; } int read_case() { int i; fscanf(input,"%d",&n); if (n==0) return 0; for (i=0; i