首页 > 其他 > 详细

POJ 2502 【思维是朴素的最短路 卡输入和建图】

时间:2015-09-27 09:58:38      阅读:188      评论:0      收藏:0      [点我收藏+]

题意:

给出两个坐标,分别是小明家和小明学校的坐标。

给出多条地铁线,给出每站的坐标,已知地铁是双向的,每条线以-1 -1结尾。

给出地铁速度,步行速度。

地铁线可看成是顺次连接的线段。

求小明从家到学校用到的时间。

思路:

任何两点之间都可以连速度为步行的无向边,地铁相邻两站可以连速度为地铁速度的无向边。

之后进行SPFA;

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
const int inf=999999999;
double dis[205];
bool vis[205];
double numa=500.0/3;
double numb=2000.0/3;
struct node
{
    double x,y;
};
node nodes[205];
struct edge
{
    int id;
    double mint;
    edge *next;
};
edge edges[90500];
edge *adj[205];
int ednum;
int num;
double cal(int a,int b,double c)
{
    return sqrt((nodes[a].x-nodes[b].x)*(nodes[a].x-nodes[b].x)+(nodes[a].y-nodes[b].y)*(nodes[a].y-nodes[b].y))/c;
}
inline void addEdge(int a,int b,double c)
{
    edge *tmp;
    tmp=&edges[ednum];
    ednum++;
    tmp->id=b;
    tmp->mint=c;
    tmp->next=adj[a];
    adj[a]=tmp;
}
void SPFA()
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<num;i++)
    {
        dis[i]=inf;
    }
    queue<int>q;
    q.push(1);
    vis[1]=1;
    dis[1]=0;
    while(!q.empty())
    {
        int tmp=q.front();
        q.pop();
        vis[tmp]=0;
        for(edge *p=adj[tmp];p;p=p->next)
        {
            if(p->mint+dis[tmp]<dis[p->id])
            {
                dis[p->id]=p->mint+dis[tmp];
                if(!vis[p->id])
                {
                    q.push(p->id);
                    vis[p->id]=1;
                }
            }
        }
    }
}
int main()
{
    for(int i=1;i<=204;i++)
    {
        adj[i]=NULL;
    }
    ednum=0;
    num++;
    scanf("%lf%lf",&nodes[num].x,&nodes[num].y);
    num++;
    scanf("%lf%lf",&nodes[num].x,&nodes[num].y);
    num++;
    while(scanf("%lf%lf",&nodes[num].x,&nodes[num].y)!=EOF)
    {
        num++;
        while(scanf("%lf%lf",&nodes[num].x,&nodes[num].y))
        {
            if(nodes[num].x<0&&nodes[num].y<0)
                break;
            num++;
            addEdge(num-1,num-2,cal(num-1,num-2,numb));
            addEdge(num-2,num-1,cal(num-1,num-2,numb));
        }
    }
    for(int i=1;i<num;i++)
    {
        for(int j=1;j<i;j++)
        {
            addEdge(i,j,cal(i,j,numa));
            addEdge(j,i,cal(i,j,numa));
        }
    }
    SPFA();
    printf("%.0lf\n",dis[2]);
}

 

POJ 2502 【思维是朴素的最短路 卡输入和建图】

原文:http://www.cnblogs.com/tun117/p/4841856.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!