loj 1379(最短路变形)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27087

思路:题目的意思是求S->T的所有路径中花费总和小于给定的P值的所经过的路径上的最大权值。我们可以从起点做一次SPFA,然后求出起点到所有点的最短路径,然后以终点为起点,将边反向,求终点到起点的最短路,然后枚举每一条边即可,求最大值。

loj 1379(最短路变形)
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<queue>

 6 using namespace std;

 7 #define MAXN 22222

 8 #define MAXM 222222

 9 #define inf 1<<30

10 #define FILL(a,b) memset(a,b,sizeof(a))

11 

12 template<class T>inline T Get_Min(const T &a,const T &b){ return a<b?a:b; }

13 template<class T>inline T Get_Max(const T &a,const T &b){ return a>b?a:b; }

14 struct Edge{

15     int v,w,next;

16 }edge1[MAXM],edge2[MAXM];

17 

18 int n,m,st,ed,p,NE1,NE2;

19 int head1[MAXN],head2[MAXN];

20 

21 void Insert1(int u,int v,int w)

22 {

23     edge1[NE1].v=v;

24     edge1[NE1].w=w;

25     edge1[NE1].next=head1[u];

26     head1[u]=NE1++;

27 }

28 

29 void Insert2(int u,int v,int w)

30 {

31     edge2[NE2].v=v;

32     edge2[NE2].w=w;

33     edge2[NE2].next=head2[u];

34     head2[u]=NE2++;

35 }

36 

37 int dist[2][MAXN];

38 bool mark[MAXN];

39 void spfa(int st,int ed,Edge *edge,int *dist,int *head)

40 {

41     FILL(mark,false);

42     fill(dist,dist+n+2,inf);

43     queue<int>que;

44     que.push(st);

45     dist[st]=0;

46     while(!que.empty()){

47         int u=que.front();

48         que.pop();

49         mark[u]=false;

50         for(int i=head[u];i!=-1;i=edge[i].next){

51             int v=edge[i].v,w=edge[i].w;

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

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

54                 if(!mark[v]){

55                     mark[v]=true;

56                     que.push(v);

57                 }

58             }

59         }

60     }

61 }

62 

63 

64 int main()

65 {

66     int _case,u,v,w,ans,t=1;

67     scanf("%d",&_case);

68     while(_case--){

69         scanf("%d%d%d%d%d",&n,&m,&st,&ed,&p);

70         NE1=NE2=0;

71         FILL(head1,-1);

72         FILL(head2,-1);

73         while(m--){

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

75             Insert1(u,v,w);

76             Insert2(v,u,w);

77         }

78         spfa(st,ed,edge1,dist[0],head1);

79         spfa(ed,st,edge2,dist[1],head2);

80         ans=-1;

81         for(int u=1;u<=n;u++){

82             for(int i=head1[u];i!=-1;i=edge1[i].next){

83                 int v=edge1[i].v,w=edge1[i].w;

84                 if(dist[0][u]!=inf&&dist[1][v]!=inf&&dist[0][u]+w+dist[1][v]<=p){

85                     ans=Get_Max(ans,w);

86                 }

87             }

88         }

89         printf("Case %d: %d\n",t++,ans);

90     }

91     return 0;

92 }
View Code

 

你可能感兴趣的:(最短路)