社区讨论

80分求助

P1491集合位置参与者 9已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mi6yku26
此快照首次捕获于
2025/11/20 12:56
4 个月前
此快照最后确认于
2025/11/20 15:33
4 个月前
查看原帖
WA#3和#6 根本不知道哪里错了。 我的思路是跑两遍dijkstra,然后枚举边来求出最短路
CPP
#include <cstdio>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#define MAXN 100005
#define wzx using
#define AK namespace
#define IOI std;
wzx AK IOI
struct point {
	int x , y;
}p[MAXN];
struct Edge {
	int v , nx ;
	double w;
}e[MAXN * 4];
int n , m , ecnt , x , y , u , v , head[MAXN]; 
double dis1[MAXN] , dis2[MAXN];
bool vis[MAXN]; 
struct node {
	int id;
	double w;
};
bool operator < (node a , node b) {
	return a.w > b.w;
}
void add(int f , int t , double w) {
	e[++ecnt] = (Edge){t , head[f] , w};
	head[f] = ecnt;
}
double d(point a , point b) {
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 
}
void dijkstra(int s , double dis[]) {
	for (int i = 1 ; i <= n ; i++) {
		dis[i] = 19260817.999999;
	}
	memset(vis , 0 , sizeof(vis));
	dis[s] = 0.0;
	priority_queue <node> q;
	q.push((node){s , 0.0});
	while (!q.empty()) {
		node f = q.top();
		q.pop();
		int v = f.id;
		if (vis[v]) continue;
		vis[v] = 1;
		for (int i = head[v] ; i ; i = e[i].nx) {
			int to = e[i].v;
			if (dis[to] > dis[v] + e[i].w) {
				dis[to] = dis[v] + e[i].w;
				q.push((node){to , dis[to]});
			}
		}
	}
}
int main() {
	scanf("%d%d" , &n , &m);
	for (int i = 1 ; i <= n ; i++) {
		scanf("%d%d" , &p[i].x , &p[i].y);
	}
	for (int i = 1 ; i <= m ; i++) {
		scanf("%d%d" , &u , &v);
		add(u , v , d(p[u] , p[v]));
		add(v , u , d(p[u] , p[v]));
	}
	dijkstra(1 , dis1);
	dijkstra(n , dis2);
	double INF = 222222222.0;
	double ans = INF;
	for (int i = 1 ; i <= n ; i++) {
		for (int j = head[i] ; j ; j = e[j].nx) {
			int v = e[j].v;
			double k = e[j].w;
			double tem = dis1[i] + dis2[v] + k;
			if (tem > dis1[n] && tem < ans) {
				ans = tem;
			}
		}
	}
	if (ans >= INF) {
		printf("-1");
		return 0;
	}
	printf("%.2f" , ans);
	return 0;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...