hdu 2962(最短路+二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962

思路:二分枚举高度,每次都sfpa一下,然后如果dist[e]存在的话,就更新shortpath...

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<queue>

 4 #include<vector>

 5 #include<algorithm>

 6 const int MAXN=1000+10;

 7 const int inf=1<<30;

 8 using namespace std;

 9 struct Node{

10     int v,w,h;

11 };

12 vector<Node>mp[MAXN];

13 int n,m;

14 int s,e;

15 int dist[MAXN];

16 bool visited[MAXN];

17 

18 void SPFA(int u,int limit){

19     for(int i=1;i<=n;i++)dist[i]=inf;

20     dist[u]=0;

21     memset(visited,false,sizeof(visited));

22     queue<int>Q;

23     Q.push(u);

24     while(!Q.empty()){

25         int u=Q.front();

26         Q.pop();

27         visited[u]=false;

28         for(int i=0;i<mp[u].size();i++){

29             int v=mp[u][i].v;

30             int h=mp[u][i].h;

31             int w=mp[u][i].w;

32             if(h<limit)continue;//h应该尽量要大

33             if(dist[u]+w<dist[v]){

34                 dist[v]=dist[u]+w;

35                 if(!visited[v]){

36                     Q.push(v);

37                     visited[v]=true;

38                 }

39             }

40         }

41     }

42 }

43 

44 

45 

46 int main(){

47     int _case=1;

48     while(~scanf("%d%d",&n,&m)&&(n+m)){

49         if(_case>1)puts("");

50         for(int i=1;i<=n;i++)mp[i].clear();

51         for(int i=1;i<=m;i++){

52             int u,v,w,h;

53             scanf("%d%d%d%d",&u,&v,&h,&w);

54             Node p1,p2;

55             p1.v=u,p2.v=v;

56             p1.w=p2.w=w;

57             if(h==-1)h=inf;

58             p1.h=p2.h=h;

59             mp[u].push_back(p2);

60             mp[v].push_back(p1);

61         }

62         int limit;

63         scanf("%d%d%d",&s,&e,&limit);

64         //二分的时候得注意了,不知为什么wa了好多次

65         int low=0,high=limit,res=inf;

66         while(low<high){

67             int mid=(low+high+1)>>1;

68             SPFA(s,mid);

69             if(dist[e]==inf){

70                 high=mid-1;

71             }else {

72                 low=mid;

73                 res=dist[e];

74             }

75         }

76         printf("Case %d:\n",_case++);

77         if(res==inf){

78             printf("cannot reach destination\n");

79         }else {

80             printf("maximum height = %d\n",low);

81             printf("length of shortest route = %d\n",res);

82         }

83     }

84     return 0;

85 }

 

你可能感兴趣的:(HDU)