题目
思路
离散化一下 对x\y相等的点连边
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
int dis[1000010];
bool vis[1000010];
vector<pair<int,int>> e[1000010];
void add_edge(int u,int v,int w){
e[u].push_back(make_pair(v,w));
e[v].push_back(make_pair(u,w));
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m;
cin>>n>>m;
int sx,sy,fx,fy;
cin>>sx>>sy>>fx>>fy;
add_edge(0,m+1,abs(sx-fx)+abs(sy-fy));
dis[m+1]=abs(sx-fx)+abs(sy-fy);
vector<pair<int,int>> xx,yy;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
dis[i]=min(abs(x-sx),abs(y-sy));
add_edge(i,m+1,abs(x-fx)+abs(y-fy));
xx.push_back(make_pair(x,i));
yy.push_back(make_pair(y,i));
}
sort(xx.begin(),xx.end());
sort(yy.begin(),yy.end());
for(int i=0;i<m-1;i++){
add_edge(xx[i].second,xx[i+1].second,xx[i+1].first-xx[i].first);
add_edge(yy[i].second,yy[i+1].second,yy[i+1].first-yy[i].first);
}
priority_queue<pair<int,int>> q;
for(int i=0;i<=m+1;i++) q.push(make_pair(-dis[i],i));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=0;i<e[u].size();i++){
int to = e[u][i].first;
int val = e[u][i].second;
if(dis[to]>dis[u]+val){
dis[to]=dis[u]+val;
if(!vis[to]) q.push(make_pair(-dis[to],to));
}
}
}
cout<<dis[m+1]<<endl;
return 0;
}