POJ 2502 Dijkstra OR spfa

原创 2016年08月29日 10:39:09

思路:

建完了图就是模板水题了 …..

但是建图很坑。

首先要把出发点向地铁站&终点 连一条边

地铁站之间要连无向边

地铁站向终点连一条边

以上的边权要*0.006

两个地铁站之间要连无向边 边权*0.0015

//By SiriusRen
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 40500
int n,ex,ey,cnt=1,tot=0;
int xx,yy,lastx,lasty;
struct node{int now;double weight;}jy,top;
double w[N],dis[333];
int v[N],next[N],first[333],px[N],py[N];
bool vis[333];
void add(int x,int y,double ww){
    w[tot]=ww;v[tot]=y;
    next[tot]=first[x];first[x]=tot++;
}
priority_queue<node>pq;
bool operator <(node a,node b){
    return a.weight>b.weight;
}
void Dijkstra(){
    jy.now=jy.weight=0;
    pq.push(jy);
    while(!pq.empty()){
        top=pq.top();pq.pop();
        if(vis[top.now])continue;
        vis[top.now]=1;
        for(int i=first[top.now];~i;i=next[i])
            if(!vis[v[i]]&&dis[v[i]]>dis[top.now]+w[i]){
                dis[v[i]]=dis[top.now]+w[i];
                jy.now=v[i];
                jy.weight=top.weight+w[i];
                pq.push(jy);
            }
    }
}
queue<int>q;
void spfa()
{
    q.push(0);
    while(!q.empty())
    {
        int t=q.front();q.pop();
        vis[t]=0;
        for(int i=first[t];~i;i=next[i])
        {
            if(dis[v[i]]>dis[t]+w[i])
            {
                dis[v[i]]=dis[t]+w[i];
                if(!vis[v[i]])q.push(v[i]),vis[v[i]]=1;
            }
        }
    }
}
int main()
{
    for(int i=1;i<=222;i++)dis[i]=0x3fffff;
    memset(first,-1,sizeof(first));
    scanf("%d%d%d%d",&px[0],&py[0],&ex,&ey);
    scanf("%d%d",&lastx,&lasty);
    px[cnt]=lastx;py[cnt]=lasty;
    while(scanf("%d%d",&xx,&yy)){
        if(xx==-1&&yy==-1){
            if(scanf("%d%d",&lastx,&lasty)==EOF)break;
            cnt++;
            px[cnt]=lastx;py[cnt]=lasty;
            continue;
        }
        add(cnt,cnt+1,sqrt((lastx-xx)*(lastx-xx)+(lasty-yy)*(lasty-yy))*0.0015);
        add(cnt+1,cnt,sqrt((lastx-xx)*(lastx-xx)+(lasty-yy)*(lasty-yy))*0.0015);
        lastx=xx,lasty=yy;
        cnt++;
        px[cnt]=lastx;py[cnt]=lasty;
    }
    px[++cnt]=ex;py[cnt]=ey;
    for(int i=0;i<=cnt;i++)
        for(int j=i+1;j<=cnt;j++){
            add(i,j,sqrt((px[i]-px[j])*((px[i]-px[j]))+(py[i]-py[j])*(py[i]-py[j]))*0.006);
            add(j,i,sqrt((px[i]-px[j])*((px[i]-px[j]))+(py[i]-py[j])*(py[i]-py[j]))*0.006);
        }
    spfa();
    printf("%d\n",(int)(dis[cnt]+0.5));
}

这里写图片描述

版权声明:本文由SiriusRen原创,未经允许不得转载

最短路径问题的Dijkstra和SPFA算法总结

Dijkstra算法: 解决带非负权重图的单元最短路径问题。时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择...
  • hq572241670
  • hq572241670
  • 2014年04月11日 14:07
  • 1023

最短路算法详解(Dijkstra/SPFA/Floyd)

常用的图论最短路算法详解(dijkstra/SPFA/floyd)
  • murmured
  • murmured
  • 2014年02月16日 13:08
  • 2592

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较

几个最短路径算法的比较: Floyd        求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。        Floyd-Warshall算法(Floyd-...
  • zs520ct
  • zs520ct
  • 2016年04月22日 17:05
  • 1978

poj 2516 Minimum(SPFA解决最小费用最大流)

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 16007   Accepted: 56...
  • a15110103117
  • a15110103117
  • 2016年09月26日 19:10
  • 130

Dijkstra、Bellman-Ford及Spfa算法思想对比

Dijkstradijkstra算法本质上算是贪心的思想,每次在剩余节点中找到离起点最近的节点放到队列中,并用来更新剩下的节点的距离,再将它标记上表示已经找到到它的最短路径,以后不用更新它了。这样做的...
  • mmy1996
  • mmy1996
  • 2016年08月16日 23:10
  • 5195

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体,整理一下最短路径算法。会陆续的更新。。。   一、多源最短路算法——floyd算法       floyd算法主要用于求任意两点间的最短路径,也成最短最短路径问题。...
  • caihongshijie6
  • caihongshijie6
  • 2014年05月23日 19:45
  • 4744

Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较

参考
  • u011644423
  • u011644423
  • 2014年07月19日 11:00
  • 2339

POJ 3259 Wormholes(SPFA算法判断是否存在负环)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36755   Accepted: 13457...
  • zwj1452267376
  • zwj1452267376
  • 2015年08月19日 21:03
  • 746

最短路的一些板子

起因是一场训练赛,这道题我和Thor拿出了正解(之一),但非常令人发指地送出了不计其数的TLE。   题干不说了,我们的做法是前向星建图,然后每个LPG(起点终点也算LPG)跑一遍SPFA,然后所有L...
  • wjfwzzc
  • wjfwzzc
  • 2014年04月03日 15:11
  • 839

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford) Dijkstra算法: 解决的问题:     带权重的有向图上单源最短路径问题。且权重都为非...
  • qq_33406883
  • qq_33406883
  • 2016年07月20日 17:55
  • 1363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2502 Dijkstra OR spfa
举报原因:
原因补充:

(最多只允许输入30个字)