poj 2253 Frogger

这道题我是用并查集处理的,将所有边排序,当生成树里出现第一个点,第二个点时(或第0点第1个点),结束并查集,输出已处理边里的最大值就可以了。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 #define MAXN 210
 5 int n,g,h,u[MAXN*MAXN],v[2*MAXN*MAXN],p[MAXN],r[2*MAXN*MAXN];
 6 double x[MAXN],y[MAXN],w[2*MAXN*MAXN],flag[2*MAXN*MAXN];
 7 
 8 int cmp(const void *_p, const void *_q)
 9 {
10     int *p = (int *)_p;
11     int *q = (int *)_q;
12     return w[*p]>w[*q] ? 1 : -1;
13 }
14 int find(int x2){return p[x2] == x2 ? x2 : p[x2] = find(p[x2]);}
15 void kruskal()
16 {
17     double ans = -1;
18     int ok1 = 0, ok2 = 0;
19     for(int i = 0; i < n; i ++) p[i] = i;
20     for(int i = 0; i < h; i ++) r[i] = i;
21     qsort(r,h,sizeof(r[0]),cmp);
22     g = 0;
23     for(int i = 0; i < h; i ++)
24     {
25         int e = r[i];
26         int x1 = find(u[e]), y1 = find(v[e]);
27         if(find(0) == find(1))break;
28         if(x1 != y1)
29         {
30             p[x1] = y1;
31             flag[g ++] = w[e];
32          }
33     }
34     for(int i = 0; i < g; i ++)
35     {
36         if(flag[i] > ans) ans = flag[i];
37     }
38     printf("Frog Distance = %.3f\n\n",ans);
39 }
40 void init()
41 {
42     int num = 1;
43     while(~scanf("%d",&n))
44     {
45         if(n == 0) break;
46         for(int i = 0; i < n; i ++)
47             scanf("%lf%lf",&x[i], &y[i]);
48         h = 0;
49         for(int i = 0; i < n; i ++)
50             for(int j = i+1; j < n; j ++)
51             {
52                 double dis = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
53                 u[h] = i, v[h] = j, w[h++] = dis;
54                 u[h] = j; v[h] = i, w[h++] = dis;
55             }
56             printf("Scenario #%d\n",num++);
57         kruskal();    
58     }    
59 }
60 
61 int main()
62 {
63     init();
64     return 0;
65 }
原文地址:https://www.cnblogs.com/yuzhaoxin/p/2621257.html