建的确实是分层图,连边也是横纵相邻的点连上它们对应的距离,连的也是无向边,无解-1也判了啊...看了下错因,似乎也没有爆int,求大佬QWQ
代码如下
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
const int maxn=200010;
vector<int>v[maxn],val[maxn];
vector<int>dirc[maxn];
struct node{
int num;
int x;
int y;
}nd[maxn];
bool cmp(node x,node y){
if(x.x==y.x){
return x.y<y.y;
}
else return x.x<y.x;
}
bool cmp2(node x,node y){
if(x.y==y.y){
return x.x<y.y;
}
else return x.y<y.y;
}
bool cmp3(node x,node y){
return x.num<y.num;
}
int dis[maxn];
bool vis[maxn];
void dijkstra(int x){
queue<int>q;
queue<int>dr;
q.push(x);
dis[x]=0;
vis[x]=1;
q.push(x);
dr.push(1);
dr.push(2);
while(!q.empty()){
int now=q.front();
int drrec=dr.front();
dr.pop();
q.pop();
vis[now]=0;
if(nd[now].num==m) continue;
for(int i=0;i<v[now].size();i++){
int newn=v[now][i];
if(drrec==dirc[now][i]){
if(dis[newn]>dis[now]+val[now][i]){
dis[newn]=dis[now]+val[now][i];
if(!vis[newn]){
vis[newn]=1;
q.push(newn);
dr.push(dirc[now][i]);
}
}
}
else{
if(dis[newn]>dis[now]+val[now][i]+1){
dis[newn]=dis[now]+val[now][i]+1;
if(!vis[newn]){
vis[newn]=1;
q.push(newn);
dr.push(dirc[now][i]);
}
}
}
}
}
return ;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>nd[i].x>>nd[i].y;
nd[i].num=i;
}
int a,b,c,d;
cin>>a>>b>>c>>d;
nd[++m].x=a;
nd[m].y=b;
nd[m].num=m;
nd[++m].x=c;
nd[m].y=d;
nd[m].num=m;
sort(nd+1,nd+1+m,cmp);
for(int i=1;i<=m;i++){
if(nd[i].x!=nd[i-1].x) continue;
v[nd[i].num].push_back(nd[i-1].num);
v[nd[i-1].num].push_back(nd[i].num);
val[nd[i].num].push_back(abs(nd[i-1].y-nd[i].y)*2);
val[nd[i-1].num].push_back(abs(nd[i-1].y-nd[i].y)*2);
dirc[nd[i-1].num].push_back(1);
dirc[nd[i].num].push_back(1);
}
sort(nd+1,nd+1+m,cmp2);
for(int i=1;i<=m;i++){
if(nd[i].y!=nd[i-1].y) continue;
v[nd[i].num].push_back(nd[i-1].num);
v[nd[i-1].num].push_back(nd[i].num);
val[nd[i].num].push_back(abs(nd[i-1].x-nd[i].x)*2);
val[nd[i-1].num].push_back(abs(nd[i-1].x-nd[i].x)*2);
dirc[nd[i].num].push_back(2);
dirc[nd[i-1].num].push_back(2);
}
sort(nd+1,nd+1+m,cmp3);
for(int i=1;i<=m;i++){
dis[i]=2147483647;
vis[i]=0;
}
dijkstra(m-1);
if(dis[m]==2147483647) cout<<"-1"<<endl;
else cout<<dis[m]<<endl;
return 0;
}