zoukankan      html  css  js  c++  java
  • 第k短路和次短路模板

    第k短路模板

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<cstring>
      5 #include<algorithm>
      6 #include<map>
      7 #include<queue>
      8 #include<stack>
      9 #include<vector>
     10 #include<set>
     11 using namespace std;
     12 typedef long long ll;
     13 typedef pair<ll,int> P;
     14 const int maxn=2e5+100,maxm=2e5+100,inf=0x3f3f3f3f,mod=1e9+7;
     15 const ll INF=1e17+7;
     16 struct edge
     17 {
     18     int from,to;
     19     ll w;
     20 };
     21 vector<edge>G[maxn],T[maxn];
     22 priority_queue<P,vector<P>,greater<P> >q;
     23 ll dist[maxn];
     24 void addedge(int u,int v,ll w)
     25 {
     26     G[u].push_back((edge)
     27     {
     28         u,v,w
     29     });
     30     T[v].push_back((edge)
     31     {
     32         v,u,w
     33     });
     34 }
     35 void dij(int s)
     36 {
     37     dist[s]=0LL;
     38     q.push(P(dist[s],s));
     39     while(!q.empty())
     40     {
     41         P p=q.top();
     42         q.pop();
     43         int u=p.second;
     44         for(int i=0; i<T[u].size(); i++)
     45         {
     46             edge e=T[u][i];
     47             if(dist[e.to]>dist[u]+e.w)
     48             {
     49                 dist[e.to]=dist[u]+e.w;
     50                 q.push(P(dist[e.to],e.to));
     51             }
     52         }
     53     }
     54 }
     55 struct node
     56 {
     57     int to;
     58     ///g(p)为当前从s到p所走的路径的长度;dist[p]为点p到t的最短路的长度;
     59     ll g,f;///f=g+dist,f(p)的意义为从s按照当前路径走到p后再走到终点t一共至少要走多远;
     60     bool operator<(const node &x ) const
     61     {
     62         if(x.f==f) return x.g<g;
     63         return x.f<f;
     64     }
     65 };
     66 
     67 ll A_star(int s,int t,int k)
     68 {
     69     priority_queue<node>Q;
     70     if(dist[s]==INF) return -1;
     71     int cnt=0;
     72     if(s==t) k++;
     73     ll g=0LL;
     74     ll f=g+dist[s];
     75     Q.push((node)
     76     {
     77         s, g, f
     78     });
     79     while(!Q.empty())
     80     {
     81         node x=Q.top();
     82         Q.pop();
     83         int u=x.to;
     84         if(u==t) cnt++;
     85         if(cnt==k) return x.g;
     86         for(int i=0; i<G[u].size(); i++)
     87         {
     88             edge e=G[u][i];
     89             ll g=x.g+e.w;
     90             ll f=g+dist[e.to];
     91             Q.push((node)
     92             {
     93                 e.to, g, f
     94             });
     95         }
     96     }
     97     return -1;
     98 }
     99 void init(int n)
    100 {
    101     for(int i=0; i<=n+10; i++) G[i].clear(),T[i].clear();
    102 }
    103 int main()
    104 {
    105         int n,m;
    106         scanf("%d%d",&n,&m);
    107         for(int i=1; i<=m; i++)
    108         {
    109             int u,v;
    110             ll w;
    111             scanf("%d%d%lld",&u,&v,&w);
    112             addedge(u,v,w);
    113             addedge(v,u,w);
    114         }
    115         int s,t,k;
    116         scanf("%d%d%d",&s,&t,&k);
    117         for(int i=0; i<=n; i++) dist[i]=INF;
    118         dij(t);
    119         printf("%lld
    ",A_star(s,t,k));//s到t的第k短路
    120         init(n);
    121         return 0;
    122 }

    次短路

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<map>
     7 #include<queue>
     8 #include<stack>
     9 #include<vector>
    10 #include<set>
    11 using namespace std;
    12 typedef pair<int,int> P;
    13 typedef long long ll;
    14 const int maxn=2e5+100,inf=0x3f3f3f3f,mod=1e9+7;
    15 const ll INF=1e15+7;
    16 struct edge
    17 {
    18     int from,to;
    19     ll cost;
    20 };
    21 vector<edge>es;
    22 vector<int>G[maxn];
    23 priority_queue<P,vector<P>,greater<P> >que;
    24 void addedge(int u,int v,ll w)
    25 {
    26     es.push_back((edge)
    27     {
    28         u,v,w
    29     });
    30     es.push_back((edge)
    31     {
    32         v,u,w
    33     });
    34     int x=es.size();
    35     G[u].push_back(x-2);
    36     G[v].push_back(x-1);
    37 }
    38 ll dist[maxn],dist2[maxn];
    39 int pre[maxn];
    40 void dij(int s)
    41 {
    42     dist[s]=0LL;
    43     que.push(P(0LL,s));
    44     while(!que.empty())
    45     {
    46         P p=que.top();
    47         que.pop();
    48         int u=p.second;
    49         ll d=p.first;
    50         if(dist2[u]<d) continue;
    51         for(int i=0; i<G[u].size(); i++)
    52         {
    53             edge e=es[G[u][i]];
    54             ll w=d+e.cost;
    55             if(dist[e.to]>w)
    56             {
    57                 swap(dist[e.to],w);
    58                 pre[e.to]=G[u][i];
    59                 que.push(P(dist[e.to],e.to));
    60             }
    61             if(dist2[e.to]>w&&dist[e.to]<w)
    62             {
    63                 dist2[e.to]=w;
    64                 que.push(P(dist[e.to],e.to));
    65             }
    66         }
    67     }
    68 }
    69 void init(int n)
    70 {
    71     es.clear();
    72     for(int i=0; i<=n+10; i++) G[i].clear();
    73 }
    74 int main()
    75 {
    76     int T;
    77     scanf("%d",&T);
    78     while(T--)
    79     {
    80         int n,m;
    81         scanf("%d%d",&n,&m);
    82         for(int i=1; i<=m; i++)
    83         {
    84             int u,v;
    85             ll w;
    86             scanf("%d%d%lld",&u,&v,&w);
    87             addedge(u,v,w);
    88         }
    89         for(int i=1; i<=n; i++) dist[i]=dist2[i]=INF;
    90         dij(1);//起点是1
    91         init(n);
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    poj 1743 Musical Theme 后缀数组
    poj 1743 Musical Theme 后缀数组
    cf 432D Prefixes and Suffixes kmp
    cf 432D Prefixes and Suffixes kmp
    hdu Data Structure? 线段树
    关于position和anchorPoint之间的关系
    ios POST 信息
    CALayers的代码示例
    CALayers详解
    ios中得sqlite使用基础
  • 原文地址:https://www.cnblogs.com/hhxj/p/7424897.html
Copyright © 2011-2022 走看看