最短路径问题
D 最短路径问题 - 第七届校赛热身赛 —— 补题
题目大意:
平面上有 n n n 个点( n < = 100 n<=100 n<=100 ),每个点坐标均在 [ − 10000 , 10000 ] [-10000,10000] [−10000,10000] 之间,给定 m m m 条边表示第 $u_i $和 v i v_i vi 点有一条边连接,现在任务是找出从一点到另一点之间的最短路径。
思路:
n n n 只有 100 100 100 ,可以跑一边 n 2 n^2 n2 的朴素 d i j k s t r a dijkstra dijkstra,边的大小表示为两点之间的距离
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
const int N=110;
int n,m;
int vis[N];
double g[N][N],d[N];
pair<int,int> a[N];
int st,ed;
void dijkstra() {
for(int i=1;i<=n;i++){
d[i]=1e18;
vis[i]=0;
}
d[st]=0;
for(int i=1;i<=n;i++){
double mi=1e18;
int xi=-1;
for(int j=1;j<=n;j++){
if(vis[j]==0&&d[j]<mi){
xi=j;
mi=d[j];
}
}
vis[xi]=1;
for(int j=1;j<=n;j++){
if(vis[j]==0){
if(g[xi][j]>0&&d[xi]+g[xi][j]<d[j]){
d[j]=d[xi]+g[xi][j];
}
}
}
}
}
signed main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].fi>>a[i].se;
}
cin>>m;
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
double x=sqrt( (a[u].fi-a[v].fi)*(a[u].fi-a[v].fi) + (a[u].se-a[v].se)*(a[u].se-a[v].se) );
g[u][v]=x;
g[v][u]=x;
}
cin>>st>>ed;
dijkstra();
printf("%.2f",d[ed]);
return 0;
}