求助,链式前向星Dijkstra70分,WA #2 #9 #10
查看原帖
求助,链式前向星Dijkstra70分,WA #2 #9 #10
735387
songtj楼主2022/9/1 11:33

R.T\mathcal{R} . \mathcal{T}

代码:

#include <bits/stdc++.h>
#define INF 0x7fffffff
typedef long long ll;
using namespace std;

ll n, m, s, minn;
int cnt;
ll head[500010], dis[500010];
bool visit[500010];

template <typename _Ip>
inline void read(_Ip &x) {
    char ch = getchar(), sgn = 0; x = 0;
    while (ch ^ '-' && !isdigit(ch)) ch = getchar();
    if (ch == '-') ch = getchar(), sgn = 1;
    while (isdigit(ch)) x = (x<<3)+(x<<1) + (ch^48), ch = getchar();
    if (sgn) x = -x;
}

template <typename _Op>
inline void write(_Op x) {
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
// -------- 日常快读快写请忽略 --------

struct Edge {
	int to;
	int next;
	int w;
} edge[100010];

void add(int u, int v, int w) {
	edge[++cnt].to = v;
	edge[cnt].w = w;
	edge[cnt].next = head[u];
	head[u] = cnt;
}

int main() {
	read(n);read(m);read(s);
	for (int i = 1; i <= n; ++i) {
		dis[i] = INF;
	}
	int u, v, w;
	for (int i = 0; i < m; ++i) {
		read(u);read(v);read(w);
		add(u, v, w);
	}
	dis[s] = 0;
	ll pos = s;
	while(visit[pos] == false) {
		visit[pos] = true;
		for (int i = head[pos]; i != 0; i = edge[i].next) {
			if (!visit[edge[i].to] && dis[pos]+edge[i].w < dis[edge[i].to]) {
				dis[edge[i].to] = dis[pos] + edge[i].w;
			}
		}
		minn = INF;
		for (int i = 1; i <= n; ++i) {
			if (!visit[i] && minn > dis[i]) {
				minn = dis[i];
				pos = i;
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		write(dis[i]);
		putchar(' ');
	}
	return 0;
}

(抱歉,由于测试用例过长,粘贴到云剪贴板时会直接卡死,所以无法提供样例)

2022/9/1 11:33
加载中...