2502 SUBWAY(FLOYD演算法求解最短路)
阿新 • • 發佈:2018-12-22
/*
題意就是求去學校所花最短時間,在每一段距離中我們可以選擇步行也可以選擇坐地鐵,因為有些路可能沒有地鐵,所以我們需要選擇最佳路徑
輸入家和學校的座標;
然後再給出你地鐵的座標,這個就是卡你的輸入了,因為它那個每次
走到-1 -1 的時候呢它的第一個節點是不能讀取的,因為只有相鄰的兩個節點,
它才會有距離感。這個後續解釋;
那麼咋們應該怎麼solve it?首選dijkstra,因為它的地鐵站點一共就200個,
所以說用dijkstra應該來說沒什麼問題;
*/
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<iomanip>
//#include<bits/stdc++.h>
using namespace std;
const int maxn=3e2+7;
struct Node
{
double x,y;
}node[maxn];
double far(Node a,Node b)///間距吧;
{
return sqrt(double((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
const double inf=1e7+7;
bool vis[maxn];
double dis[maxn],mmp[maxn][maxn];
/*
int n;這個是真的坑,我傻逼的定義了兩個n後來以為會傳到函式裡面 看了
半天,沒有錯誤啊,後來輸出n的時候發現n'的值變為了0 尷尬
尷尬的找了一個晚上;
*/
void Dijkstra(int n)
{
for(int i=1;i<=n;i++)
{
dis[i]=mmp[1][i];
vis[i]=false;
}
//printf("%d\n",n);
//memset(vis,false,sizeof(vis));
//dis[1]=0;
vis[1 ]=true;
for(int j=1;j<n;j++)
{
int k;
double Min=inf;///後來發現連這個for都走不進去;
for(int i=1;i<=n;i++)
if(!vis[i]&&dis[i]<Min)
{
Min=dis[i];
k=i;
}
//if(k==-1) break;
vis[k]=true;
for(int i=1;i<=n;i++)
if(!vis[i]&&(dis[k]+mmp[k][i])<dis[i])
dis[i]=dis[k]+mmp[k][i];
}
/*for(int i=1;i<=n;i++)
printf("%.0f\n",dis[i]);*/
printf("%.0f\n",dis[2]);
}
int main ()
{
double xx,yy;
int n=2,flag;
/*for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
if(i==j) mmp[i][j]=0;
else mmp[i][j]=inf;*///將mmp進行初始化;
scanf("%lf %lf %lf %lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y);
mmp[1][2]=mmp[2][1]=far(node[1],node[2]);
while(~scanf("%lf %lf",&xx,&yy))
{
if(xx==-1&&yy==-1) { flag=1;continue;}
n++;
node[n].x=xx,node[n].y=yy;
for(int i=1;i<n;i++)
mmp[i][n]=mmp[n][i]=far(node[i],node[n])/500*3;//將每次與它可能相鄰的節點的距離進行計算得到步行的結果所需時間;
///每次都更新到最後一個站臺的時間
///不知道為甚麼,這樣寫的話呢總感覺自己寫的哪裡不對勁。這樣產生的時間它那個後來不是進行覆蓋了嗎??
///後來發現它求的只是到最後一個站臺走路花的時間,這樣就減少了初始化的時間啊。對後面的地鐵時間並沒有影響;
if(!flag) mmp[n][n-1]=mmp[n-1][n]=far(node[n],node[n-1])/2000*3;
else flag=0;
}
//printf("%d\n",n);
/*for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
printf("%f \n",mmp[j][k]);
}
printf("\n");
}*/
/*for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mmp[i][j]=min(mmp[i][j],far(node[i],node[j])/500*3);*/
///這個呢,其實可以結合mmp的初始化,拉出來去求兩點之間的最小值(時間);
Dijkstra(n);
return 0;
}