poj2502(SPFA+建图)

本文介绍了一种使用SPFA算法求解最短路径问题的C++实现方法,通过构建节点结构和邻接表来表示图,并利用优先队列进行最短路径搜索。文章详细展示了如何计算两点之间的欧几里得距离并将其应用于加权图中。

http://poj.org/problem?id=2502

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <set>
using namespace std;
#define MAXN 2050
#define MAXM 100000+10
#define INF 999999999
struct Node{
    int to,next;
    double val;
}node[MAXM];
int px[MAXN],py[MAXN];
int head[MAXN],tot,n,m;
bool vis[MAXN];
double dis[MAXN];
double dist(int i,int j) {
       int x = px[i]-px[j];
       int y = py[i]-py[j];
       return sqrt(x*x+y*y*1.0);
}
void add(int x,int y,int d){
    double temp=dist(x,y)/(d*1000.0/60);
    node[tot].to=y;
    node[tot].next=head[x];
    node[tot].val=temp;
    head[x]=tot++;

    node[tot].to=x;
    node[tot].next=head[y];
    node[tot].val=temp;
    head[y]=tot++;
}
void spfa(){
    int x,t,i;
    queue<int >q;
    memset(vis,0,sizeof(vis));
    for(i=0;i<n;i++) dis[i]=INF;
    dis[0]=0;q.push(0);vis[0]=1;
    while(!q.empty()){
        x=q.front();q.pop();vis[x]=0;
        for(i=head[x];i!=-1;i=node[i].next)
        if(dis[node[i].to]>dis[x]+node[i].val){
                dis[node[i].to]=dis[x]+node[i].val;
                if(!vis[node[i].to]){vis[node[i].to]=1;q.push(node[i].to);}
        }//if
    }//while
}
int main(){
    tot=0;
    memset(vis,0,sizeof(vis));
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d",&px[0],&py[0],&px[1],&py[1]);
    int pos,i,j;
    pos=i=2;
    while(scanf("%d%d",&px[i],&py[i])!=EOF){
        if(px[i]==-1&&py[i]==-1){
            for(j=pos;j<i-1;j++) add(j,j+1,40);
            pos=i;
        }else   i++;
    }//while
    n=i;
    for(i=0;i<n;i++)for(j=i+1;j<n;j++) add(i,j,10);
    spfa();
    printf("%.0lf\n",dis[1]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值