poj 2502 Subway 【spfa】

来源:互联网 发布:nginx 后端服务器宕机 编辑:程序博客网 时间:2024/06/16 21:30



点击打开链接


给你n条地铁。问你从起点到终点最小耗时。

地铁40km/h 步行10km/h 


题解:  只有最多只有200个车站,所以只要是最短路的算法,都能写。

就是处理边比较烦人,

因为之前忘记考虑不相邻车站的步行距离导致一直wa。




#include<iostream>#include<cstring>#include<queue>#include<cstdio>#include<map>#include<stack>#include<cmath>#include<algorithm>#include<vector>#define LL long longusing namespace std;const double inf=999999999;pair<double,double>p,st,ed,train[222];map<pair<double,double>,int>m;int cnt=0;struct Edge{    int v;    double w;    Edge(int _v=0,double _w=0):v(_v),w(_w){}};vector<Edge>e[222*222];void addedge(int u,int v,double w){    e[u].push_back(Edge(v,w));}double getd(pair<double ,double>x,pair<double ,double>y){    return sqrt((x.first-y.first)*(x.first-y.first)+(x.second-y.second)*(x.second-y.second));}int vis[222];double dis[222];void spfa(){    memset(vis,0,sizeof(vis));    for(int i=0;i<=cnt;++i) dis[i]=inf;    vis[1]=1;    dis[1]=0;    queue<int>que;    while(!que.empty()) que.pop();    que.push(1);    while(!que.empty()){        int u=que.front();        que.pop();        vis[u]=0;        for(int i=0;i<e[u].size();++i){            int v=e[u][i].v;            if(dis[v]>dis[u]+e[u][i].w){                dis[v]=dis[u]+e[u][i].w;                if(!vis[v]){                    vis[v]=1;                    que.push(v);                }            }        }    }}int main(){    int i,nn=0,len=0;    double a,b;    scanf("%lf %lf %lf %lf",&st.first,&st.second,&ed.first,&ed.second);    m[st]=++cnt;m[ed]=++cnt;    double t=getd(st,ed);    addedge(m[st],m[ed],t);addedge(m[ed],m[st],t);    while(~scanf("%lf %lf",&a,&b)){        train[len].first=a,train[len].second=b;        if(!m[train[len]]) m[train[len++]]=++cnt;        while(scanf("%lf %lf",&a,&b)){             if(a==-1&&b==-1)break;             train[len].first=a,train[len].second=b;             if(!m[train[len]]) m[train[len++]]=++cnt;        }double ss;        for(i=nn;i<len-1;++i){            ss=getd(train[i],train[i+1])/4.0;            addedge(m[train[i]],m[train[i+1]],ss);            addedge(m[train[i+1]],m[train[i]],ss);        }        nn=len;    }    for(int i=0;i<len;++i){        double ss=getd(train[i],st);            addedge(m[train[i]],m[st],ss);            addedge(m[st],m[train[i]],ss);        ss=getd(train[i],ed);            addedge(m[train[i]],m[ed],ss);            addedge(m[ed],m[train[i]],ss);        for(int j=i+1;j<nn;++j){            double ss=getd(train[i],train[j]);            addedge(m[train[i]],m[train[j]],ss);            addedge(m[train[j]],m[train[i]],ss);        }    }    spfa();    printf("%.0f\n",dis[2]*3.0/500.0);return 0;}


0 0
原创粉丝点击