独立ip做多个网站重庆seo按天收费
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;
}