zoukankan      html  css  js  c++  java
  • loj 1379(最短路变形)

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

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

     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
    ",t++,ans);
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    省选测试42
    省选测试41
    省选测试40
    省选测试39
    python海龟画图生成星星
    Python-列表简介
    Linux系统中设置默认的Java版本
    虚拟机无线网卡桥接失败
    pycharm设置启动图标
    禁用vscode硬件加速
  • 原文地址:https://www.cnblogs.com/wally/p/3389737.html
Copyright © 2011-2022 走看看