rt,样例2没过。
#include <iostream>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <string.h>
#include <queue>
#include <stdio.h>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int N = 2e6 + 10;
const int INF = 0x3f3f3f3f;
int head[N], ne[N], to[N], w[N], id;
int n, m;
void add(int x, int y, int z)
{
to[++id] = y;
ne[id] = head[x];
head[x] = id;
w[id] = z;
}
struct EDGE
{
int x, y, id;
}p[N];
bool cmp(EDGE a, EDGE b)
{
if(a.x == a.x) return a.y < b.y;
return a.x < b.x;
}
bool kmp(EDGE a, EDGE b)
{
if(a.y == b.y) return a.x < b.x;
return a.y < b.y;
}
void add_init()
{
for(int i = 1; i <= n; i++)
{
add(i,i+n,(i!=n-1)&&(i!=n));
add(i+n,i,(i!=n)&&(i!=n-1));
}
sort(p + 1, p + n + 1, cmp);
for(int i = 2; i <= n; i++)
{
if(p[i].x == p[i - 1].x)
{
add(p[i].id, p[i - 1].id, 2 * abs(p[i].y - p[i - 1].y));
add(p[i - 1].id, p[i].id, 2 * abs(p[i].y - p[i - 1].y));
}
}
sort(p + 1, p + n + 1, kmp);
for(int i = 2; i <= n; i++)
{
if(p[i].y == p[i - 1].y)
{
add(p[i].id + n, p[i - 1].id + n, 2 * abs(p[i].x - p[i - 1].x));
add(p[i - 1].id + n, p[i].id + n, 2 * abs(p[i].x - p[i - 1].x));
}
}
}
struct DIJ
{
int id, dis;
bool operator < (const DIJ &a) const
{
return dis > a.dis;
}
};
bool vis[N];
int dis[N];
void dijkstra(int s)
{
priority_queue<DIJ> p;
memset(dis, 0x3f, sizeof dis);
dis[s] = 0;
p.push({s, 0});
while(!p.empty())
{
int u = p.top().id;
p.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; i; i = ne[i])
{
int v = to[i];
if(dis[v] > dis[u] + w[i])
{
dis[v] = dis[u] + w[i];
if(!vis[v]) p.push({v, dis[v]});
}
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> m >> n;
n+=2;
for(int i = 1; i <= n; i++)
{
cin >> p[i].x >> p[i].y;
p[i].id = i;
}
add_init();
dijkstra(n - 1);
// dijkstra(n + n - 1);
// for(int i = 1; i <= n * 2; i++) cout << dis[i] << " ";
if(dis[n] == (0x3f3f3f3f)) cout << -1 << endl;
else cout << dis[n] << endl;
return 0;
}