70pts求助
查看原帖
70pts求助
1036693
carp_oier楼主2023/9/12 12:59
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define rl register ll

const ll N = 210, M = 400010;
const double INF = 1e20;

ll n, m;

ll tot, h[N], e[M], ne[M];

double w[M], dis[N][2];

bool st[N][2];

struct point
{
	ll x, y;
}p[N];

struct node
{
	ll id; double dis; ll type;
	bool operator <(const node &x) const
	{
		return dis > x.dis;
	}
};

priority_queue<node> q;

inline double get_dist(ll a, ll b)
{
	point aa = p[a], bb = p[b];
	ll x = abs(aa.x - bb.x), y = abs(aa.y - bb.y);
	return sqrt(x * x + y * y);
}

inline void add(ll a, ll b, double c)
{
	ne[++tot] = h[a], h[a] = tot, e[tot] = b, w[tot] = c;
}

inline void dij()
{
	memset(st, 0, sizeof st);
	for(rl i=0; i <= n; ++ i)
		dis[i][0] = dis[i][1] = INF;
		
	dis[1][0] = dis[1][1] = 0;
	q.push({1, 0, 0});
	while(q.size())
	{
		node asd = q.top();
		q.pop();
		ll u = asd.id, t = asd.type;
		double dist = asd.dis;
		if(st[u][t]) continue;
		st[u][t] = 1;
		for(rl i=h[u]; ~i; i = ne[i])
		{
			ll v = e[i];
			if(dis[v][0] > dist + w[i])
			{
				dis[v][1] = dis[v][0];
				q.push({v, dis[v][1], 1});
				dis[v][0] = dist + w[i];
				q.push({v, dis[v][0], 0});
			}
			else if(dis[v][1] > dist + w[i])
			{
				dis[v][1] = dist + w[i];
				q.push({v, dis[v][1], 1});
			}
		}
	}
}

int main()
{
	memset(h, -1, sizeof h);
	
	cin >> n >> m;
	
	for(rl i=1; i <= n; ++ i)
	{
		ll a, b;
		cin >> p[i].x >> p[i].y;
	}
	
	for(rl i=1; i <= m; ++ i)
	{
		ll a, b;
		cin >> a >> b;
		double dist = get_dist(a, b);
		add(a, b, dist), add(b, a, dist);
	}
	
	dij();
	
	if(dis[n][1] >= INF)
	{
		cout << "-1" << endl;
		return 0;
	}
	printf("%.2f\n", dis[n][1]);
	return 0;
}
2023/9/12 12:59
加载中...