经(luo)典(ti) K短路题目= =

  K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html

  流程:

  先把所有边逆向,做一遍dijkstra,得到估价函数h(x)(x到T的最短路距离)

  f(x)=g(x)+h(x)

  按f(x)维护一个堆……T第k次出堆时的g(T)即为ans

  另外,需要特判:如果S==T,k++

 1 Source Code
 2 Problem: 2449        User: sdfzyhy
 3 Memory: 11260K        Time: 141MS
 4 Language: G++        Result: Accepted
 5 
 6     Source Code
 7 
 8     //POJ 2449
 9     #include<queue>
10     #include<cstdio>
11     #include<cstring>
12     #include<cstdlib>
13     #include<iostream>
14     #include<algorithm>
15     #define rep(i,n) for(int i=0;i<n;++i)
16     #define F(i,j,n) for(int i=j;i<=n;++i)
17     #define D(i,j,n) for(int i=j;i>=n;--i)
18     #define pb push_back
19     using namespace std;
20     typedef long long LL;
21     inline int getint(){
22         int r=1,v=0; char ch=getchar();
23         for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
24         for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
25         return r*v;
26     }
27     const int N=1010,M=100010,INF=0x3f3f3f3f;
28     /*******************template********************/
29     int to[2][M],next[2][M],head[2][N],len[2][M],cnt[2];
30     void ins(int x,int y,int z,int k){
31         to[k][++cnt[k]]=y; next[k][cnt[k]]=head[k][x]; head[k][x]=cnt[k]; len[k][cnt[k]]=z;
32     }
33     #define f(i,x,k) for(int i=head[k][x],y=to[k][i];i;i=next[k][i],y=to[k][i])
34 
35     int n,m,K,S,T;
36     int d[N],times[N],from[N],route[N];
37     bool vis[N];
38     typedef pair<int,int>pii;
39     #define mp make_pair
40     void dij(){
41         priority_queue<pii,vector<pii>,greater<pii> >Q;
42         memset(d,0x3f,sizeof d);
43         d[T]=0;
44         Q.push(mp(0,T));
45         while(!Q.empty()){
46             int x=Q.top().second; Q.pop();
47             if (vis[x]) continue;
48             vis[x]=1;
49             f(i,x,0)
50                 if (!vis[y] && d[y]>d[x]+len[0][i]){
51                     d[y]=d[x]+len[0][i];
52                     Q.push(mp(d[y],y));
53                 }
54         }
55     //    F(i,1,n) printf("%d ",d[i]); puts("");
56     }
57 
58     struct node{
59         LL w,to;
60         bool operator < (const node &b)const {
61             return w+d[to] > b.w+d[b.to];
62         }
63     };
64     LL astar(){
65         priority_queue<node>Q;
66         memset(times,0,sizeof times);
67         if (d[S]==INF) return -1;
68         Q.push((node){0,S});
69         while(!Q.empty()){
70             LL x=Q.top().to,w=Q.top().w; Q.pop();
71     //        printf("%lld %lld\n",x,w);
72             times[x]++;
73             if (x==T && times[T]==K) return w;
74             if (times[x]>K) continue;
75             f(i,x,1) Q.push((node){w+len[1][i],y});
76         }
77         return -1;
78     }
79 
80     int main(){
81     #ifndef ONLINE_JUDGE
82         freopen("2449.in","r",stdin);
83         freopen("2449.out","w",stdout);
84     #endif
85         n=getint(); m=getint(); 
86         F(i,1,m){
87             int x=getint(),y=getint(),z=getint();
88             ins(x,y,z,1); ins(y,x,z,0);
89         }
90         S=getint(); T=getint(); K=getint();
91         if (S==T) K++;
92         dij();
93         printf("%lld\n",astar());
94         return 0;
95     }
View Code

相关文章:

  • 2022-02-01
  • 2022-12-23
  • 2021-07-04
  • 2022-01-10
  • 2021-07-04
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
猜你喜欢
  • 2021-07-28
  • 2021-11-10
  • 2022-02-04
  • 2021-06-23
  • 2021-05-21
  • 2021-09-10
  • 2021-05-20
相关资源
相似解决方案