zoukankan      html  css  js  c++  java
  • poj 2449 A*求k短路

    A*的入门题目,需要注意的是当图中只有一个点的时候k短路是不存在的。

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 using namespace std;
      6 
      7 const int INF = 0x3f3f3f3f;
      8 const int N = 1001;
      9 const int M = 100000;
     10 int head[N];
     11 int rhead[N];
     12 int dist[N];
     13 int visit[N];
     14 int n, m, e;
     15 
     16 struct Edge
     17 {
     18     int v, next, w;
     19 } edge[M], redge[M];
     20 
     21 void addEdge( int u, int v, int w )
     22 {
     23     edge[e].v = v;
     24     edge[e].w = w;
     25     edge[e].next = head[u];
     26     head[u] = e;
     27     redge[e].v = u;
     28     redge[e].w = w;
     29     redge[e].next = rhead[v];
     30     rhead[v] = e;
     31     e++;
     32 }
     33 
     34 void spfa( int t )
     35 {
     36     memset( dist, 0x3f, sizeof(dist) );
     37     memset( visit, 0, sizeof(visit) );
     38     int q[N], top = 0;
     39     dist[t] = 0;
     40     q[top] = t;
     41     top = ( top + 1 ) % n;
     42     visit[t] = 1;
     43     for ( int i = 0; i != top; i = ( i + 1 ) % n )
     44     {
     45         int u = q[i];
     46         visit[u] = 0;
     47         for ( int j = rhead[u]; j != -1; j = redge[j].next )
     48         {
     49             int v = redge[j].v, w = redge[j].w;
     50             if ( dist[v] > dist[u] + w )
     51             {
     52                 dist[v] = dist[u] + w;
     53                 if ( !visit[v] )
     54                 {
     55                     q[top] = v;
     56                     top = ( top + 1 ) % n;
     57                     visit[v] = 1;
     58                 }
     59             }
     60         }
     61     }
     62 }
     63 
     64 struct Node 
     65 {
     66     int u, g;
     67     Node(){}
     68     Node( int _u, int _g )
     69     {
     70         u = _u, g = _g;
     71     }
     72     bool operator < ( const Node & o ) const 
     73     {
     74         return dist[u] + g > dist[o.u] + o.g;
     75     }
     76 };
     77 
     78 int a_star( int s, int t, int k )
     79 {
     80     priority_queue<Node> q;
     81     q.push( Node( s, 0 ) );
     82     memset( visit, 0, sizeof(visit) );
     83     while ( !q.empty() )
     84     {
     85         Node cur = q.top();
     86         q.pop();
     87         visit[cur.u]++;
     88         if ( visit[t] == k ) return cur.g;
     89         if ( visit[cur.u] > k ) continue;
     90         for ( int i = head[cur.u]; i != -1; i = edge[i].next )
     91         {
     92             int v = edge[i].v, w = edge[i].w;
     93             q.push( Node( v, cur.g + w ) );
     94         }
     95     }
     96     return -1;
     97 }
     98 
     99 int main ()
    100 {
    101     while ( scanf("%d%d", &n, &m) != EOF )
    102     {
    103         e = 0;
    104         memset( head, -1, sizeof(head) );
    105         memset( rhead, -1, sizeof(rhead) );
    106         while ( m-- )
    107         {
    108             int u, v, w;
    109             scanf("%d%d%d", &u, &v, &w);
    110             addEdge( u, v, w );
    111         }
    112         int s, t, k;
    113         scanf("%d%d%d", &s, &t, &k);
    114         spfa(t);
    115         if ( dist[s] == INF )
    116         {
    117             printf("-1
    ");
    118             continue;
    119         }
    120         if ( s == t ) k++;
    121         printf("%d
    ", a_star( s, t, k ));
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    关于ExtJSExtender 拓荒者
    jquery easyui datagrid 分页数据请求 拓荒者
    ExtJS布局:制作后台管理布局 拓荒者
    WebAPI用法 拓荒者
    WordPress实践:上传文件时提示“缺少临时文件夹” 拓荒者
    【转】Javascript MD5编码 拓荒者
    看懂ExtJS的API 拓荒者
    IIS下实现wordpress URL静态化 拓荒者
    再谈angularjs DI(Dependency Injection)
    Javascript覆盖率(jstd)报表解析Maven插件
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4719033.html
Copyright © 2011-2022 走看看