给你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 long
using 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;
}