分层图样例不过求调
查看原帖
分层图样例不过求调
664034
_xxxxx_楼主2024/5/15 21:11

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;
}
2024/5/15 21:11
加载中...