The universe said you are stronger than you know.|

Momo·Trace

园龄:3年3个月粉丝:6关注:1

最短路径问题

平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间,其中的一些点之间有连线。

若有连线,则表示可从一个点到达另一个点,即两点间有通路,同路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

小提示:

  1. 两点的距离:如果点A坐标为(xA,yA),点B的坐标为(xB,yB)dis(A,B)=(xAxB)2+(yAyB)2
    C++中求根使用sqrt();
  2. 保留两位小数:使用double变量,double ans;print("%.2lf",ans);

输入

共n+m+3行。

  • 第 1 行:整数n

  • 第2行到第n+1行(共n行),每行两个整数x和y,描述一个点的坐标。

  • 第n+2行为一个整数m,m1000,表示图中连线的个数。

  • 此后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

  • 最后一行:两个整数s和t,分别表示源点和目标点。两个数之间用一个空格隔开。

输出

仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。


样例输入

5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5

样例输出

3.41



#include <bits/stdc++.h>
using namespace std;
int a,b,n,m,vis[10010],x[10010],y[10010];
double dis[10010];
bool d[1100][1100];
queue<int> q;
void bfs()
{
q.push(a);
dis[a]=0;
vis[a]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=1;
for(int i=1;i<=b;i++)
{
if(d[u][i]&&!vis[i])
{
q.push(i);
dis[i]=dis[u]+sqrt(double(x[i]-x[u])*double(x[i]-x[u])+double(y[i]-y[u])*double(y[i]-y[u]));
vis[i]=1;
if(i==b)
{
cout << fixed << setprecision(2) << dis[i];
return;
}
}
}
}
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> x[i] >> y[i];
}
cin >> m;
for(int i=1;i<=m;i++)
{
int f,ff;
cin >> f >> ff;
d[f][ff]=d[ff][f]=1;
}
cin >> a >> b;
bfs();
return 0;
}
posted @   Momo·Trace  阅读(129)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起