• 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
  • 相关阅读:
    android 之MediaPlayer MP3播放,VideoView 视频播放,MediaRecorder 录音
    IPHONE 开发 4 iPhone应用程序目录构成,工程项目的构成
    iPhone交流
    UILabel 用法
    跨网段 访问
    IPHONE 开发 8 Object C Foundation.h它包括所有的类 方法 集合,(id)init,iphone上使用Sqlite的注意事项小结
    查看与某一个表相关的视图、存储过程、函数
    IPHONE 开发 1 体系介绍
    android 之手机拨号器,以及短信发送器的简单实现
    Linux命令整理
  • 原文地址:https://www.cnblogs.com/sook/p/3169492.html
Copyright © 2020-2023  润新知