解题思路:把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分
4 人评分
C语言训练-计算一个整数N的阶乘 (C语言代码)浏览:936 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:449 |
WU-C语言程序设计教程(第三版)课后习题11.12 (C++代码)(想学链表的小伙伴可以看看)浏览:905 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:673 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:567 |
老王赛马 (C++代码)浏览:905 |
C二级辅导-温度转换 (C语言代码)浏览:550 |
C语言程序设计教程(第三版)课后习题7.2 (C++代码)浏览:437 |
素数的个数 一直是超时浏览:668 |
计算表达式浏览:643 |