POJ 3255 - 求两点间的第二短路

3 篇文章 0 订阅

   注意这里求的不是两点间的第二短长度...就是说如果两点间距离有两条路径都是最短路径~~那最第二短路径长度还是这个最短路径..

   做了POJ2449的两点间K短路后这道题就是它的缩小版...唯一要留意的就是边是无向边....


Program:

#include<iostream>
#include<queue>
#define MAXN 200001
using namespace std;
struct node
{
     int h,g,p;
     bool operator < (node a) const
     {
          return a.h+a.g<h+g;     
     }     
};
struct nodeOfLine
{
     int x,y,w,next;      
}line[MAXN];
int n,r,link[5001],g[5001];
priority_queue<node> myqueue;
void djikstra()
{
    int i,j,k,t;  
    bool used[MAXN];
    memset(g,0x7F,sizeof(g)); 
    memset(used,false,sizeof(used));
    g[n]=0;
    for (t=1;t<=n;t++)
    {
         j=0;
         for (i=1;i<=n;i++)
           if (!used[i] && (!j || g[i]<g[j])) j=i; 
         used[j]=true;
         k=link[j];
         while (k)
         {
              if (g[line[k].y]>g[line[k].x]+line[k].w)  
                   g[line[k].y]=g[line[k].x]+line[k].w; 
              k=line[k].next;      
         }
    }
    return;
}
int Astar()
{
    node h,temp;
    int times[5001],k;
    while (!myqueue.empty()) myqueue.pop();
    memset(times,0,sizeof(times)); 
    h.p=1; h.h=h.g=0; 
    myqueue.push(h);
    while (!myqueue.empty())
    {
          h=myqueue.top();
          myqueue.pop();
          times[h.p]++;
          if (times[h.p]>2) continue;
          if (times[h.p]==2 && h.p==n) return h.h+h.g;
          k=link[h.p];
          while (k)
          {
                temp.p=line[k].y;
                temp.h=h.h+line[k].w;
                temp.g=g[line[k].y];
                myqueue.push(temp);
                k=line[k].next;     
          }         
    }
    return -1;
}
int main()
{ 
    scanf("%d%d",&n,&r);
    memset(link,0,sizeof(link)); 
    for (int i=1;i<=r;i++)
    {          
          scanf("%d%d%d",&line[i*2-1].x,&line[i*2-1].y,&line[i*2-1].w);
          line[i*2-1].next=link[line[i*2-1].x]; link[line[i*2-1].x]=i*2-1;
          line[i*2].x=line[i*2-1].y; line[i*2].y=line[i*2-1].x; line[i*2].w=line[i*2-1].w;
          line[i*2].next=link[line[i*2].x]; link[line[i*2].x]=i*2;
    } 
    r*=2;
    djikstra();
    printf("%d\n",Astar());
    return 0;   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值