K最短路 A*算法

POJ2449 Remmarguts' Date

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <queue>
  4 #include <stdio.h>
  5 using namespace std;
  6 int m,n,s,t,k;
  7 #define M 100005
  8 #define N 1005
  9 #define INF 100000000
 10 int dis[N];
 11 struct edge
 12 {
 13     int v,val,next;//边的终点,边权
 14     edge(){}
 15     edge(int _v,int _val,int _next){v=_v,val=_val,next=_next;}
 16 }line[M],_line[M];
 17 int head[M],_head[M];
 18 
 19 struct dijnode
 20 {
 21     int v,dis;
 22     dijnode(){}
 23     dijnode(int _v,int _dis){v=_v,dis=_dis;}
 24     friend bool operator <(const dijnode &a,const dijnode &b)
 25     {
 26         return a.dis>b.dis;
 27     }
 28 };
 29 struct Anode
 30 {
 31     int v,g,h;//v:当前点 g:起点到点v距离 h:点v到终点距离
 32     Anode(){}
 33     Anode(int _v,int _g,int _h){v=_v,g=_g;h=_h;}
 34     friend bool operator <(const Anode&a,const Anode&b)
 35     {
 36         return a.h+a.g>b.h+b.g;
 37     }
 38 };
 39 void input(){
 40     memset(head,-1,sizeof(head));
 41     memset(_head,-1,sizeof(_head));
 42     int u,v,val;
 43     int e=0,_e=0;
 44     for(int i=0;i<m;i++)
 45     {
 46         scanf("%d%d%d",&u,&v,&val);
 47         line[e]=edge(v,val,head[u]);
 48         head[u]=e++;
 49         _line[_e]=edge(u,val,head[v]);
 50         _head[v]=_e++;
 51     }
 52 }
 53 int vis[N];
 54 void dijkstra()
 55 {
 56     memset(vis,0,sizeof(vis));
 57     priority_queue<dijnode>pq;
 58     for(int i=0;i<n;i++)
 59         dis[i]=INF;
 60     
 61     dijnode node =dijnode(t,0);
 62     dis[t]=0;
 63     pq.push(node);
 64     
 65     while(!pq.empty())
 66     {
 67         dijnode tmp = pq.top();
 68         pq.pop();
 69         
 70         if(vis[tmp.v])continue;
 71         vis[tmp.v]=1;
 72         for(int i=_head[tmp.v];i!=-1;i=_line[i].next)
 73         {
 74             if(tmp.dis+_line[i].val<dis[_line[i].v])
 75             {
 76                 dis[_line[i].v]=tmp.dis+_line[i].val;
 77                 pq.push(dijnode(_line[i].v,dis[_line[i].v]));
 78             }
 79         }
 80     }
 81     for(int i=1;i<=n;i++)printf("%d
",dis[i]);
 82     
 83 }
 84 int kcnt[N];
 85 int Astar()
 86 {
 87     if(dis[s]>=INF)return -1;
 88     memset(kcnt,0,sizeof(kcnt));
 89     priority_queue<Anode> pq;
 90     pq.push(Anode(s,0,dis[s]));
 91     Anode node;
 92     while(!pq.empty())
 93     {
 94         node = pq.top();
 95         pq.pop();
 96         if(kcnt[node.v]>=k)continue;
 97         
 98         kcnt[node.v]++;
 99         if(kcnt[t]>=k)return node.g;
100         for(int i=head[node.v];i!=-1;i = line[i].next)
101         {
102             pq.push(Anode(line[i].v,node.g+line[i].val,dis[line[i].v]));
103         }
104     }
105     return -1;
106     
107 }
108 int main(int argc, const char * argv[])
109 {
110     
111     while(scanf("%d%d",&n,&m)!=EOF)
112     {
113         input();
114         scanf("%d%d%d",&s,&t,&k);
115         dijkstra();
116         printf("%d
",Astar());
117     }
118 }
View Code
原文地址:https://www.cnblogs.com/sook/p/3169492.html