hdu 1598 (并查集加贪心) 速度与激情

题目传送门: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 }

 

你可能感兴趣的:(HDU)