POJ2449 第K短路

POJ2449 第K短路

  • 改了好长时间发现读入读反了qwq
  • A*,先在反向图上求出每个点到t的最短距离,作为估价函数即可
  • 疑问:能不能直接记录h+g

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cctype>
  4 #include <algorithm>
  5 #include <queue>
  6 #include <iostream>
  7 using namespace std;
  8 
  9 #define N 10010
 10 #define M 100010
 11 #define inf 0x3f3f3f3f
 12 #define res register int
 13 inline int read()
 14 {
 15     int x(0),f(1); char ch;
 16     while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
 17     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
 18     return f*x;
 19 }
 20 
 21 int n,m,k,s,t;
 22 int head[N],ver[M<<1],nxt[M<<1],edge[M<<1];
 23 int head2[N],ver2[M<<1],nxt2[M<<1],edge2[M<<1];
 24 int tot,tot2;
 25 inline void add(int x,int y,int z)
 26 {
 27     ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot ; edge[tot]=z;
 28     ver2[++tot2]=x; nxt2[tot2]=head2[y]; head2[y]=tot2; edge2[tot2]=z;
 29 }
 30 int f[N],vis[N],dis[N];
 31 struct node{
 32     int id,dis;
 33     bool operator <(const node &n2)const{
 34     return dis>n2.dis;}
 35 };
 36 struct node2{
 37     int id,h,g;
 38     bool operator <(const node2 &n2)const{
 39     return h+g>n2.h+n2.g;}
 40 };
 41 
 42 inline void get_f()
 43 {
 44     memset(f,0x3f,sizeof(f));
 45     priority_queue<int,vector<int>,greater<int> > q;
 46     q.push(t); f[t]=0; vis[t]=1;
 47     while(q.size())
 48     {
 49         int x=q.top(); q.pop(); vis[x]=0;
 50         for(res i=head2[x] ; ~i ; i=nxt2[i])
 51         {
 52             int y=ver2[i];  
 53             if(f[y]>f[x]+edge2[i])
 54             {
 55                 f[y]=f[x]+edge2[i];
 56                 if(!vis[y])
 57                     vis[y]=1,q.push(y);
 58             }
 59         }
 60     }
 61 //    if(f[s]==inf) {
 62 //        puts("-1"); exit(0);
 63 //    }
 64 }
 65 
 66 
 67 
 68 int cnt[N];
 69 inline int dij()
 70 {
 71     priority_queue<node2> q;
 72     memset(vis,0,sizeof(vis)); 
 73     q.push((node2){s,0,f[s]});    
 74     while(q.size())
 75     {
 76         node2 now=q.top(); q.pop(); int x=now.id;
 77         cnt[x]++;
 78         if(cnt[x]==k && x==t) return now.h+now.g;
 79         if(cnt[x]>k) continue;
 80         for(res i=head[x] ; ~i ; i=nxt[i])
 81         {
 82             node2 tmp; int y=ver[i];
 83             tmp.id=y;
 84             tmp.h=now.h+edge[i];
 85             tmp.g=f[y];
 86 //            tmp.dis=now.dis-f[x]+edge[i]+f[y];
 87             q.push(tmp);
 88         }
 89     }
 90     return -1;
 91 }
 92 
 93 int main()
 94 {
 95     n=read(); m=read(); 
 96     memset(head,-1,sizeof(head));
 97     memset(head2,-1,sizeof(head2));
 98     for(res i=1 ; i<=m ; i++)
 99     {
100         int x=read(),y=read(),z=read();
101         add(x,y,z);
102     }
103     s=read(); t=read(); k=read();
104     if(s==t) k++;
105     get_f();
106     printf("%d\n",dij());
107     return 0;
108 }
View Code

 

posted @ 2019-02-17 08:48  孑行  阅读(167)  评论(0编辑  收藏  举报