平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间,其中的一些点之间有连线。
若有连线,则表示可从一个点到达另一个点,即两点间有通路,同路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
小提示:
- 两点的距离:如果点\(A\)坐标为\((x_A,y_A)\),点\(B\)的坐标为\((x_B,y_B)\),\(dis(A,B) = \sqrt{ (x_A-x_B)^2+(y_A-y_B)^2}\)
C++中求根使用sqrt();
- 保留两位小数:使用double变量,double ans;print("%.2lf",ans);
输入
共n+m+3行。
- 第 1 行:整数n
- 第2行到第n+1行(共n行),每行两个整数x和y,描述一个点的坐标。
- 第n+2行为一个整数m,\(m \leq 1000\),表示图中连线的个数。
- 此后的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
复制代码 样例输出- #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;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |