dijstra30分求助
查看原帖
dijstra30分求助
600333
2672434062xzl楼主2023/8/20 17:55
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n, m, s, head[N], num_edge;
int dis[N],cnt[N];
bool vis[N];
struct edge {
	int v, next;
	int w;
} e[N*4];
void add_edge(int u, int v, int w) {
	e[++num_edge].v = v;
	e[num_edge].w = w;
	e[num_edge].next = head[u];
	head[u] = num_edge;
}

void dijktra() {
	memset(dis, 0x7f, sizeof(dis));
	dis[s] = 0;
	priority_queue<pair<int, int> > q;
	q.push(make_pair(0, s));
	while (!q.empty()) {
		int u = q.top().second;
		q.pop();
		if (vis[u]||cnt[u]>=100)continue;
		vis[u] = true;
		for (int i = head[u]; i; i = e[i].next) {
			int v = e[i].v;
			if (dis[v] < dis[u] + e[i].w/(cnt[u]+1))
				continue;
			cnt[v]=cnt[u]+1;
			dis[v] = dis[u] + e[i].w/cnt[v];
			q.push(make_pair(-dis[v], v));
		}
	}
}
signed main(void) {
	int t;
	cin >> n >> m >>t>> s;
	for (int i = 1; i <= m; i++) {
		int x, y,z;
		scanf("%d %d %d", &x, &y, &z);
		add_edge(x, y, z);
		add_edge(y, x, z);
	}
	dijktra();
	cout<<dis[t];
	return 0;
}

也有设置上限啊

2023/8/20 17:55
加载中...