poj2502(SPFA+建图)

来源:互联网 发布:今晚美国公布什么数据 编辑:程序博客网 时间:2024/05/17 02:59

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 999999999struct 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;}


0 0
原创粉丝点击