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原创,但可以转载,因为我们是兄弟 爬虫能爬到这句话么哈哈哈

相关文章推荐

最短路练习12/poj/2502 Subway dijkstar,spfa,floyd都可以解决

这道题做的时间不短,花了将近4小时,自己的代码错误一直没找出来。看了题解也找了2小时才找出错误。 发现自己思考问题不全面,并且一旦入坑就很难跳出。(无法摆脱自己的定向思维)(这是个大问题) 题意:现在...

【最短路】POJ2502 SUBWAY (spfa)

subway You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of gett...

POJ 2502 Subways(Dijkstra算法)

Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3679   Accepte...

POJ-2502(需要自己建图的Dijkstra)

居然不知道Dijkstra是个什么玩意儿了,悲催 struct point { int x; int y; } p[505]; double d[505][505]; double distan...

POJ 2502 Subway ACM解题报告 (dijkstra求最短路)

第一次手搓dijkstra,以为是精度问题结果居然是模板写错(ps.我发四以后再不也写错) 首先这题是有不超过202个点(算上家和学校),距离化成时间来计算会比较方便哦。然后就是要用double型还...

POJ 2502 Subway (Dijkstra 最短路+建图)

POJ 2502 Subway (Dijkstra 最短路+建图)

poj2502 subway dijkstra

因为在路程相同的情况下,坐地铁的速度是走路的4倍,所以就不是很好计算路程再求得时间。 但可以用路程/速度得到时间,直接求最短时间。 注意两站之间的地铁线路是直的!!!其他站之间线路不一定是直的!!...

POJ 2502 Dijkstra

这道题主要麻烦在信号的等待上 写着写着容易混乱 基本思想就是Dijkstra  #include #define MAXN 305 #define INF (1 << 28) int m...

poj2502 - Subway (dijkstra )(L)

转载自:http://blog.csdn.net/wangjian8006 subway Time Limit: 1000MS Memory ...

Dijkstra-POJ-2502-Subway

Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7504 Accepted: 2440 De...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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