解题思路:把dijkstra模板拿过来,简单改一下就行,我用的是堆优化的版本。
注意事项:有些编译器可能memset函数无法正常使用;
参考代码:
#include <bits/stdc++.h>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e6+10;
int h[N],e[N],ne[N],idx;
double w[N];
bool s[N];
double dis[N];
int n,m,u;
int xy[N][2];
typedef pair<double ,int> Pii;
void add(int x,int y,double c)
{
e[idx]=y;ne[idx]=h[x];w[idx]=c;h[x]=idx++;
}
void dijkstra(int u)
{
fill(dis, dis+N, 0x3f3f3f);
dis[u]=0;
priority_queue<Pii,vector<Pii>,greater<Pii> >q;
q.push({0,u});
while(q.size())
{
Pii t=q.top();
q.pop();
int ver=t.second,distance=t.first;
if(s[ver]) continue;
s[ver]=true;
for(int i=h[ver];i!=-1;i=ne[i])
{
int j=e[i];
if(dis[j]>dis[ver]+w[i])
{
dis[j]=dis[ver]+w[i];
q.push({dis[j],j});
}
}
}
}
int main(){
fill(h, h+N, -1);
scanf("%d",&n);
int i,a,b,c,cc;
for(i=1;i<=n;i++){
scanf("%d %d",&xy[i][0],&xy[i][1]);
}
scanf("%d",&m);
double dd;
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
c=(xy[a][0]-xy[b][0])*(xy[a][0]-xy[b][0])+(xy[a][1]-xy[b][1])*(xy[a][1]-xy[b][1]);
dd = sqrt(c);
add(a,b,dd);
add(b,a,dd);
}
scanf("%d%d",&u,&cc);
dijkstra(u);
printf("%0.2lf\n",dis[cc]);
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复