hdu 1598 find the most comfortable road

https://vjudge.net/problem/HDU-1598

思路:
一开始想了很久才想通,先把边进行排序,然后枚举边的起点和终点,但是这样就是三重循环,t了。
之后的改进,大概就是,只用枚举起点,当循环到两点联通的时候,就可以break了,这样就改进成了二重循环。
一开始就是卡在,如何判断两点联通,这里用到的主要是克鲁斯卡尔算法的思想。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int par[205];
 7 
 8 struct node
 9 {
10     int a,b;
11     int d;
12 } r[1005];
13 
14 void init(int n)
15 {
16     for (int i = 1;i <= n;i++)
17         par[i] = i;
18 }
19 
20 int fin(int x)
21 {
22     if (x == par[x]) return x;
23     else return par[x] = fin(par[x]);
24 }
25 
26 void unit(int x,int y)
27 {
28     x = fin(x);
29     y = fin(y);
30 
31     if (x != y) par[x] = y;
32 }
33 
34 bool cmp(node p,node q)
35 {
36     return p.d < q.d;
37 }
38 
39 int main()
40 {
41     int n,m;
42 
43     while (scanf("%d%d",&n,&m) != EOF)
44     {
45         for (int i = 0;i < m;i++)
46         {
47             scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].d);
48         }
49 
50         sort(r,r+m,cmp);
51 
52         int q;
53 
54         scanf("%d",&q);
55 
56         for (int i = 0;i < q;i++)
57         {
58             int st,en;
59 
60             int minn = 100000000;
61 
62             scanf("%d%d",&st,&en);
63 
64             for (int j = 0;j < m;j++)
65             {
66                 init(n);
67                 bool f = 0;
68                 for (int k = j;k < m;k++)
69                 {
70                     bool ff = 0;
71 
72                     unit(r[k].a,r[k].b);
73 
74                     if (fin(st) == fin(en)) ff = 1;
75 
76                     if (ff && r[k].d - r[j].d < minn)
77                     {
78                         minn = r[k].d - r[j].d;
79                         f = 1;
80                     }
81 
82                     if (f) break;
83                 }
84             }
85 
86 
87             if (minn == 100000000) printf("-1\n");
88             else printf("%d\n",minn);
89         }
90     }
91 
92 
93     return 0;
94 }

 

posted @ 2017-07-10 17:55  qrfkickit  阅读(165)  评论(0编辑  收藏  举报