D. Returning Home(建边,dij堆优化)

Posted thusloop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Returning Home(建边,dij堆优化)相关的知识,希望对你有一定的参考价值。

Returning Home
题意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作:
1,向上、下、左、右移动一个单位,代价为一
2,可以瞬间移动到同行或同列的传送门,没有代价。
求起点到终点的最小代价。
思路:分别按x,y排序,之后建边,跑dij

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=2e18+100;
const int maxn=2e5+100;
vector<pii>g[maxn];
int n,m,dis[maxn];
struct node
{
	int x,y;
	int id;
} t[maxn];
bool cmpx(node a,node b)
{
	return a.x<b.x;
}
bool cmpy(node a,node b)
{
	return a.y<b.y;
}
void dij()
{
	priority_queue<pii,vector<pii>,greater<pii>>q;
	dis[0]=0;
	q.push({0,0});
	while(!q.empty())
	{
		auto now=q.top();
		q.pop();
		for(auto it:g[now.se])
		{
			if(dis[it.se]>dis[now.se]+it.fi)
			{
				dis[it.se]=dis[now.se]+it.fi;
				q.push({dis[it.se],it.se});
			}
		}
	}
}
signed main()
{
	IOS
	int sx,sy,fx,fy;
	cin>>n>>m;
	cin>>sx>>sy>>fx>>fy;
	dis[0]=dis[m+1]=inf;
	for(int i=1; i<=m; i++)
	{
		dis[i]=inf;
		cin>>t[i].x>>t[i].y;
		t[i].id=i;
		int w=min(abs(t[i].x-sx),abs(t[i].y-sy));
		int w3=abs(t[i].x-fx)+abs(t[i].y-fy);
		g[0].pb({w,i});
		g[i].pb({w3,m+1});
	}
	sort(t+1,t+m+1,cmpx);
	for(int i=2; i<=m; i++)
	{
		int u=t[i-1].id;
		int v=t[i].id;
		int w=min(abs(t[i].x-t[i-1].x),abs(t[i].y-t[i-1].y));
		g[u].pb({w,v});
		g[v].pb({w,u});
	}
	sort(t+1,t+m+1,cmpy);
	for(int i=2; i<=m; i++)
	{
		int u=t[i-1].id;
		int v=t[i].id;
		int w=min(abs(t[i].x-t[i-1].x),abs(t[i].y-t[i-1].y));
		g[u].pb({w,v});
		g[v].pb({w,u});
	}
	dij();
	int ans=min(dis[m+1],abs(fx-sx)+abs(fy-sy));
	cout<<ans<<"\\n";
}

以上是关于D. Returning Home(建边,dij堆优化)的主要内容,如果未能解决你的问题,请参考以下文章

堆优化dij

模板堆优化 + dij +pair 存储

单源最短路径(dij+堆优化)

dij-堆优化

洛谷P1462二分+堆优化dij

POJ 2387 Til the Cows Come Home(dij+邻接矩阵)