-
Subway
- POJ - 2502
- 注意建边就好了
- round四舍五入
- 地铁呢是不能从第一站蹦到除第二站外的站的,只能一站一站走。。。。
-
#include<iostream> #include<cstring> #include<cmath> #include<cstdlib> #include<vector> #include<math.h> using namespace std; #define maxn 100000 #define inf 0x3f3f3f3f double v1=10000.0/60; double v2=40000.0/60; struct node { double x; double y; } vetx[maxn]; vector<node>mmp[maxn]; int sx,sy,ex,ey,cnt; double dis[maxn],x,y; bool vis[maxn]; double cal(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void dij() { for(int i=0; i<=cnt; i++) { dis[i]=inf; vis[i]=0; } dis[0]=0; for(int i=0; i<=cnt; i++) { double temp=inf; int k; for(int j=0; j<=cnt; j++) if(dis[j]<temp&&!vis[j]) temp=dis[k=j]; vis[k]=1; int len=mmp[k].size(); for(int j=0; j<len; j++) { if(dis[int (mmp[k][j].x)]>dis[k]+mmp[k][j].y&&!vis[int (mmp[k][j].x)]) dis[int (mmp[k][j].x)]=dis[k]+mmp[k][j].y; } } } int main() { ios::sync_with_stdio(false); cin>>sx>>sy>>ex>>ey; vetx[0].x=sx; vetx[0].y=sy; while(cin>>x>>y) { vetx[++cnt].x=x; vetx[cnt].y=y; while(cin>>x>>y) { if(x==-1&&y==-1) break; vetx[++cnt].x=x; vetx[cnt].y=y; mmp[cnt].push_back((node) { cnt-1,cal(vetx[cnt].x,vetx[cnt].y,vetx[cnt-1].x,vetx[cnt-1].y)/v2 }); mmp[cnt-1].push_back((node) { cnt,cal(vetx[cnt].x,vetx[cnt].y,vetx[cnt-1].x,vetx[cnt-1].y)/v2 }); // cout<<cnt<<" "<<cnt-1<<endl; } } vetx[++cnt].x=ex; vetx[cnt].y=ey; for(int i=0; i<cnt; i++) for(int j=i+1; j<=cnt; j++) { mmp[i].push_back((node) { j,cal(vetx[j].x,vetx[j].y,vetx[i].x,vetx[i].y)/v1 }); mmp[j].push_back((node) { i,cal(vetx[j].x,vetx[j].y,vetx[i].x,vetx[i].y)/v1 }); } dij(); // for(int i=0; i<=cnt; i++) cout<<round(dis[cnt])<<endl; return 0; }
Subway -铁路-步行
最新推荐文章于 2024-03-15 09:30:18 发布