社区讨论
次短路模板 WA70分 求浅显hack
P1491集合位置参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo2nr8um
- 此快照首次捕获于
- 2023/10/23 16:50 2 年前
- 此快照最后确认于
- 2023/10/23 16:50 2 年前
用了一种和题解区不太一样的做法,但是WA70分
1到 i 的最短路
1到 i 的次短路
不知道是逻辑问题还是代码问题反正最后WA掉了qwq
有无大佬可以提供一组浅显的hack或者直接帮忙调了也ok【哭】
代码:
CPP#include <bits/stdc++.h>
#define pdi pair<double,int>
#define mkp(x,y) make_pair(x,y)
#define sq(x) ((x)*(x))
using namespace std;
const int maxn=205;
const int maxm=maxn*maxn<<1;
const double inf=0x7f7f7f7f;
struct node{
double x,y;
}a[maxn];
struct edge{
int to,next;
double w;
}e[maxm<<1];
int n,m,tot,h[maxn];
double d1[maxn],d2[maxn];
priority_queue <pdi,vector<pdi>,greater<pdi> > q;
inline void addEdge(int x,int y){
e[++tot]=(edge){y,h[x],sqrt(sq(a[x].x-a[y].x)+sq(a[x].y-a[y].y))};
h[x]=tot;
}
inline void dijkstra(){
d1[1]=d2[1]=0;
q.push(mkp(0,1));
while (!q.empty()){
int now=q.top().second;
double nowd=q.top().first;
q.pop();
//if (nowd>d2[now]) continue;
for (int i=h[now];i;i=e[i].next){
int v=e[i].to;
double d=nowd+e[i].w;
if (d<d1[v]){
d2[v]=d1[v];
d1[v]=d;
q.push(mkp(d1[v],v));
q.push(mkp(d2[v],v));
}else if (d<d2[v]){
d2[v]=d;
q.push(mkp(d2[v],v));
}
}
}
}
int main(){
memset(d1,inf,sizeof(d1));
memset(d2,inf,sizeof(d2));
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
for (int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
addEdge(x,y);
addEdge(y,x);
}
dijkstra();
if (d2[n]==inf) printf("-1\n");
else printf("%.2lf\n",d2[n]);
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...