#include<bits/stdc++.h>
#define INF 0x3f3f3f3f//INF代表正无穷
#define endl '\n'
using namespace std;
const int N=110;
typedef pair<int,double> PII;
vector<PII> g[N];
double dist[N];
bool vis[N];
int n,m,s,t;
struct NODE//结构体用来存储每个点的坐标
{
int x,y;
}Node[N];
void dijkstra()
{
for(int i=0;i<=n;i++)
{
dist[i]=INF;
vis[i]=false;
}
priority_queue<PII,vector<PII>,greater<PII>> q;//用小根堆来维护到初始点距离最小到的点
//first代表距离,second代表结点编号
//由于小根堆会优先按照第一个数据进行排序,所以要把距离放到first的位置
q.push({dist[s],s});
dist[s]=0;
while(q.size())
{
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=true;
for(auto [v,w]:g[u])
{
if(dist[v]>dist[u]+w)
{
dist[v]=dist[u]+w;
q.push({dist[v],v});
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>Node[i].x>>Node[i].y;
}
cin>>m;
for(int i=0;i<m;i++)
{
int u,v;
double w;
cin>>u>>v;
w=pow(Node[v].y-Node[u].y,2)+pow(Node[v].x-Node[u].x,2);
w=sqrt(w);//求出两个点之间的距离
g[u].push_back({v,w});//双向边
g[v].push_back({u,w});
}
cin>>s>>t;
dijkstra();
printf("%.2lf",dist[t]);
return 0;
}
B - 最短路径问题
于 2023-01-25 00:39:40 首次发布