3 solutions
-
5
题意
起点到终点的最短距离
思路
模板题,不必多言
只是需要用到勾股定理
代码
#include <bits/stdc++.h> using namespace std; int a[105][2],s,e; double dis[105][105]; // i 到 j 的最短路 int main(int argc, char **argv){ memset(dis,0x7f,sizeof(dis)); // 初始化最短路数组 int n,m; cin >> n; for (int i = 1;i <= n;i++){ // 点的位置 cin >> a[i][0] >> a[i][1]; } cin >> m; for (int i = 1;i <= m;i++){ int x,y; cin >> x >> y; // 勾股定理求直线距离 dis[x][y] = sqrt((a[x][0] - a[y][0]) * (a[x][0] - a[y][0]) + (a[x][1] - a[y][1]) * (a[x][1] - a[y][1])); dis[y][x] = dis[x][y]; } cin >> s >> e; // 起点和终点 // Floyd 最牛*的五行代码 for (int k = 1;k <= n;k++){ // 中间点 for (int i = 1;i <= n;i++){ // 起点 for (int j = 1;j <= n;j++){ // 终点 dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]); } } } printf("%.2lf",dis[s][e]); return 0; }
参考与鸣谢
参考了《信息学奥赛一本通》中【例 4.1】的代码
数据
优化了一下代码,并贡献了一个免费的测试点
-
1
#include <bits/stdc++.h> using namespace std; struct str{ double x,y; }a[101]; double d[101][101]; int main(){ for(int i=1;i<=101;i++){ for(int j=1;j<=101;j++){ d[i][j]=2147483647; } } int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].x>>a[i].y; } int m; cin>>m; for(int i=1;i<=n;i++){ d[i][i]=0; } for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; d[u][v]=min(d[u][v],sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x)+(a[u].y-a[v].y)*(a[u].y-a[v].y))); d[v][u]=d[u][v]; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ } } int s,t; cin>>s>>t; printf("%.2f",d[s][t]); }
-
1
#include using namespace std; struct str{ double x,y; }a[101]; double d[101][101]; int main(){ for(int i=1;i<=101;i++){ for(int j=1;j<=101;j++){ d[i][j]=2147483647; } } int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].x>>a[i].y; } int m; cin>>m; for(int i=1;i<=n;i++){ d[i][i]=0; } for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; d[u][v]=min(d[u][v],sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x)+(a[u].y-a[v].y)*(a[u].y-a[v].y))); d[v][u]=d[u][v]; //cout<<d[u][v]<<endl; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ //cout<<d[i][j]<<" "; } //cout<<endl; } int s,t; cin>>s>>t; cout<<fixed<<setprecision(2)<<d[s][t]; }
- 1
Information
- ID
- 827
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 82
- Accepted
- 29
- Uploaded By