社区讨论

次短路模板 WA70分 求浅显hack

P1491集合位置参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo2nr8um
此快照首次捕获于
2023/10/23 16:50
2 年前
此快照最后确认于
2023/10/23 16:50
2 年前
查看原帖
用了一种和题解区不太一样的做法,但是WA70分
di=d_i= 1到 i 的最短路
d2i=d2_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 条回复,欢迎继续交流。

正在加载回复...