poj 3255 Roadblocks (A*)

题意:有N个点 R个路径(双向的) 起点是1,终点是N 求1到N的次短路

思路:用的是第k短路算法 A* 具体详解看前一篇 poj 2449 这里就不注释了,都差不多的

//2604K      282MS
#include <stdio.h>
#include <string.h>
#include <queue>
#define EM 100010
#define VM 5050
const int inf = 0x3f3f3f3f;
using namespace std;

int src,des,n,e;
int head[VM],dis[VM];

struct E
{
      int to,w,nxt;
} edge[2*EM];

struct data
{
      int to,g,h;
      bool operator < (data a) const
      {
              return a.g + a.h < g + h;
      }
};

void addedge (int cu,int cv,int cw)
{
      edge[e].to = cv;
      edge[e].w = cw;
      edge[e].nxt = head[cu];
      head[cu] = e ++;
}

void dij ()
{
      int i,j,k;
      bool vis[VM];
      memset (vis,false,sizeof(vis));
      memset (dis,0x3f,sizeof(dis));
      dis[des] = 0;
      for (i = 1; i <= n; i ++)
      {
              int min = inf;
              for (j = 1; j <= n; j ++)
                      if (!vis[j]&&dis[j] < min)
                      {
                              min = dis[j];
                              k = j;
                      }
              vis[k] = true;
              for (int u = head[k]; u != -1; u = edge[u].nxt)
              {
                      int v = edge[u].to;
                      if (!vis[v]&&dis[v] > dis[k] + edge[u].w)
                              dis[v] = dis[k] + edge[u].w;
              }
      }
}

int Astar ()
{
      int cnt[VM];
      data cur,nxt;
      priority_queue <data> node;
      memset (cnt,0,sizeof (cnt));
      cur.to = src;
      cur.g = 0;
      cur.h = dis[src];
      node.push (cur);

      while (!node.empty ())
      {
              cur = node.top ();
              node.pop ();
              cnt[cur.to] ++;
              if (cnt[cur.to] > 2)
                      continue;
              if (cnt[des] == 2)
                      return cur.g;
              for (int u = head[cur.to]; u != -1; u = edge[u].nxt)
              {
                      int v = edge[u].to;
                      nxt.to = v;
                      nxt.g = cur.g + edge[u].w;
                      nxt.h = dis[v];
                      node.push (nxt);
              }
      }
      return 0;                        //这里不写return 竟然会输出个随机值,这是我想不通的
}
int main ()
{
      int m,u,v,w;
      while (~scanf ("%d%d",&n,&m))
      {
              e = 0;
              memset (head,-1,sizeof(head));
              while (m --)
              {
                      scanf ("%d%d%d",&u,&v,&w);
                      addedge (u,v,w);
                      addedge (v,u,w);
              }
              src = 1;
              des = n;
              dij ();
              int ans = Astar ();
              printf ("%d\n",ans);
      }
      return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值