50分RE分层图+dijsktra求救
查看原帖
50分RE分层图+dijsktra求救
723036
wmy18929355137楼主2025/6/24 00:02

re 6~10 https://www.luogu.com.cn/record/221289223

#include <bits/stdc++.h>
using namespace std;
#define N 800005

struct qwe {
	int i, dis_i;
	friend bool operator<(qwe a,qwe b) {
		return a.dis_i > b.dis_i;
	}
};

struct edge {
	int to,dis;
};

int n,m,a[N],s;
map <int,int> dis,vis;
//int dis[N],vis[N];
vector <edge> G[N];

int id(int i,int j) {
	return i * n + j;
}

void Dijkstra() {
	for (int i = id(1,1); i <= id(n,m); i++) {
		dis[i] = 0x3f3f3f3f;
    	vis[i] = 0;
	}
	priority_queue<qwe> q;
	q.push({id(1,s),0});
	dis[id(1,s)] = 0;
	while(!q.empty()) {
		qwe now = q.top();
		q.pop();
		if (vis[now.i] == 1)	continue;
		vis[now.i] = 1;
		for (auto v : G[now.i]) {
			if (dis[v.to] > dis[now.i] + v.dis) {
				dis[v.to] = dis[now.i] + v.dis;
				q.push({v.to,dis[v.to]});
			}
		}
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> a[i];
		if (a[i] == 0) s = i;
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (i != 1) G[id(j,i)].push_back({id(j,i - 1),1});
			if (i != m) G[id(j,i)].push_back({id(j,i + 1),1});
			if (j + a[i] <= n && j + a[i] >= 1 && i != s) {
				G[id(j,i)].push_back({id(j + a[i],i),abs(a[i]) * 2});
			}
		}
	}
	Dijkstra();
	int mini = 0x3f3f3f3f;
	for (int i = 1; i <= m; i++) {
		mini = min(mini,dis[id(n,i)]);
	}
	cout << ((mini == 0x3f3f3f3f) ? -1 : mini);
	return 0;
}

2025/6/24 00:02
加载中...