70分??剩下三个点全WA,求大佬帮看看问题何在
查看原帖
70分??剩下三个点全WA,求大佬帮看看问题何在
386890
Kogenta楼主2021/6/28 19:06

建的确实是分层图,连边也是横纵相邻的点连上它们对应的距离,连的也是无向边,无解-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;
}
2021/6/28 19:06
加载中...