社区讨论
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 条回复,欢迎继续交流。
正在加载回复...