题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1598

一道带有贪心思想的并查集

所以说像二分,贪心这类基础的要掌握的很扎实才行。

用结构体数组储存公路编号和速度,然后按照速度从小到大的排序,

然后以每条路为起点枚举(已经排了序,所以可以保证可以取最小的),再利用并查集判断是否走到

最后比较出最小的差值

code 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int inf=1000000;
 5 int father[1001];
 6 void give(int x)
 7 {
 8     for (int i=0;i<=x;i++)
 9         father[i]=i;
10 }
11 int find(int x)
12 {
13     while(x!=father[x])
14        x=father[x];
15     return father[x];
16 }
17 typedef struct {
18     int st;
19     int ed;
20     int speed;
21 }point;
22 point yj[1001];
23 bool cmp (const point &a,const point &b){return a.speed<b.speed;}
24 int main()
25 {
26     int n,m,i,j,ans,min,num,start,end;
27     int sx,sy;
28     while (~scanf("%d %d",&n,&m))
29     {
30         for (i=1;i<=m;i++)
31             scanf("%d %d %d",&yj[i].st,&yj[i].ed,&yj[i].speed);
32         sort(yj+1,yj+m+1,cmp);
33         scanf("%d",&num);
34         while (num--)
35         {
36             scanf("%d %d",&start,&end);
37             min=inf;
38             for (i=1;i<=m;i++)
39             {
40                give(n);
41                for (j=i;j<=m;j++)
42                {
43                    sx=find(yj[j].st);
44                    sy=find(yj[j].ed);
45                    if (sx!=sy)
46                       father[sx]=sy;
47                    if (find(start)==find(end))
48                    {
49                        ans=yj[j].speed-yj[i].speed;
50                        if (ans<min)
51                           min=ans;
52                        break;
53                    }
54                }
55             }
56             if (min==inf)
57                printf("-1\n");
58             else
59                printf("%d\n",min);
60         }
61     }
62     return 0;
63 }

 

posted on 2015-07-27 15:52  蜘蛛侦探  阅读(276)  评论(0编辑  收藏  举报