求助, 90分RE
查看原帖
求助, 90分RE
218188
ParanoidMO楼主2022/9/23 18:10
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
const double inf = 1e9+7.0;
struct node{
	int v, st;
	double w;
	bool operator < (const node x) const{
		return w > x.w;
	}
};
vector<node> G[maxn];
int n, m, vis[maxn];
int cnt[maxn][maxn];
int s, t, ind;
int lst[maxn];
double dis[maxn], ans = inf, px[maxn], py[maxn];
double calc(int u, int v){
	return sqrt((px[u]-px[v])*(px[u]-px[v])+(py[u]-py[v])*(py[u]-py[v]));
}

void dij(int s){
	priority_queue<node> q;
	memset(vis, 0, sizeof(vis));
	for (int i=1; i<=n; i++) dis[i] = inf;
	dis[s] = 0; vis[s] = 1; q.push({s, 0, dis[s]});
	while (!q.empty()){
		node u = q.top(); q.pop();
		int ut = u.v;
		vis[ut] = 1;
		double w = u.w;
		for (int i=0; i<G[ut].size(); i++){
			int vt = G[ut][i].v, st = cnt[ut][vt];
			double w = G[ut][i].w;
			if (dis[vt] > dis[ut] + w && st != 1){
				dis[vt] = dis[ut] + w;
				if (!vis[vt])	q.push({vt, 0, dis[vt]});
			}
		}
	}
}

void refind(int x){
	if (x == s) return;
	for (int i=0; i<G[x].size(); i++){
		int vt = G[x][i].v; 
		double w = G[x][i].w;
		if (dis[vt] + w == dis[x]){
			lst[++ind] = i;
			refind(vt);
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for (int i=1; i<=n; i++) cin>>px[i]>>py[i];
	for (int i=1; i<=m; i++){
		int u, v; cin>>u>>v;
		G[u].push_back({v, 0, calc(u, v)});
		G[v].push_back({u, 0, calc(u, v)});
	}
	s = 1; t = n;
	dij(s);
	refind(t);
	int pt1 = t, pt2;
	if (ind == 0) {
		cout<<-1;
		return 0;
	}
	for (int i=1; i<=ind; i++){
		pt2 = G[pt1][lst[i]].v;
		G[pt1][lst[i]].st = 1;
		cnt[pt1][pt2] = cnt[pt2][pt1] = 1;
		dij(s);
		ans = min(ans, dis[t]);
		cnt[pt1][pt2] = cnt[pt2][pt1] = 0;
		pt1 = pt2;
	}
	printf("%.2f", ans);
	
}

/*
3 3
0 0
1 1
0 2
1 2
1 3
2 3
 */
2022/9/23 18:10
加载中...