dij90pts求救
查看原帖
dij90pts求救
307542
yyyhy楼主2024/9/29 16:56

看起来数组没开出问题,#9莫名其妙的WA了

#include <cstdio>
#include <vector>
#include <algorithm>
#define maxn 10000
#define maxm 50000
#define maxk 10
#define inf 2100000000

struct inside {
	int a, b, c;
} a[maxm + 10];
struct side {
	int l, t;
} x;
std :: vector <side> S[maxn * (maxk + 1) + 10];
int n, m, k, s, t;

int ll[maxn * (maxk + 1) + 10];
int len[maxn * (maxk + 1) << 2];
int vis[maxn * (maxk + 1) + 10];

inline void build(int i, int l, int r) {
	if (l == r) {
		len[i] = ll[l];
		return;
	}
	int mid = l + r >> 1, ls = i << 1, rs = (i << 1) + 1;
	build(ls, l, mid), build(rs, mid + 1, r);
	len[i] = std :: min(len[ls], len[rs]);
	return;
}

inline int findmin(int i, int l, int r) {
	//printf("find : %d %d %d %d\n", i, l, r, len[i]);
	if (l == r) {
		ll[l] = len[i];
		return l;
	}
	int mid = l + r >> 1, ls = i << 1, rs = (i << 1) + 1;
	if (len[ls] < len[rs]) return findmin(ls, l, mid);
	else return findmin(rs, mid + 1, r);
}

inline void push(int i, int l, int r, int wh, int num) {
	if (l == r) {
		len[i] = num;
		return;
	}
	int mid = l + r >> 1, ls = i << 1, rs = (i << 1) + 1;
	if (wh <= mid) push(ls, l, mid, wh, num);
	else push(rs, mid + 1, r, wh, num);
	len[i] = std :: min(len[ls], len[rs]);
	return;
}

inline void dijkstra() {
	for (int i = 0; i < n; i++)
		ll[i] = inf;
	for (int i = 0, maxi = S[s].size(); i < maxi; i++)
		ll[S[s][i].t] = S[s][i].l;
	build(1, 0, n - 1);
	ll[s] = 0, vis[s] = 1;
	for (int i = 1; i < n; i++) {
		int now = findmin(1, 0, n - 1); 
		if (vis[now]) break;
		//printf("now : %d\n", now);
		vis[now] = 1;
		push(1, 0, n - 1, now, inf);
		for (int j = 0, maxj = S[now].size(); j < maxj; j++)
			if (!vis[S[now][j].t] && S[now][j].l + ll[now] < ll[S[now][j].t]) 
			    ll[S[now][j].t] = S[now][j].l + ll[now],
			    push(1, 0, n - 1, S[now][j].t, ll[S[now][j].t]);
		/*for (int i = 0; i < n; i++)
			printf("%d %d\n", i, ll[i]);
		putchar('\n');*/
	}
	return;
}

inline int cmp(inside x, inside y) {
	if (x.a != y.a) return x.a < y.a;
	if (x.b != y.b) return x.b < y.b;
	return x.c < y.c;
}

int main(void) {
	freopen("in.in", "r", stdin);
	scanf("%d %d %d\n%d %d", &n, &m, &k, &s, &t);
	for (int i = 1; i <= m; i++) {
		scanf("%d %d %d", &a[i].a, &a[i].b, &a[i].c);
		if (a[i].a > a[i].b) std :: swap(a[i].a, a[i].b);
	}
	std :: sort(a + 1, a + m + 1, cmp);
	a[0].a = -1;
	for (int i = 1; i <= m; i++) {
		if (a[i].a == a[i - 1].a && a[i].b == a[i - 1].b) continue;
		//printf("Side : %d to %d length %d\n", a[i].a, a[i].b, a[i].c);
		for (int j = 0; j < k; j++) {
			x.l = a[i].c;
			x.t = a[i].b + j * n, S[a[i].a + j * n].push_back(x);
			x.t = a[i].a + j * n, S[a[i].b + j * n].push_back(x);
			x.l = 0;
			x.t = a[i].b + (j + 1) * n, S[a[i].a + j * n].push_back(x);
			x.t = a[i].a + (j + 1) * n, S[a[i].b + j * n].push_back(x);
		}
		x.l = a[i].c;
		x.t = a[i].b + k * n, S[a[i].a + k * n].push_back(x);
		x.t = a[i].a + k * n, S[a[i].b + k * n].push_back(x);
	}
	t = t + n * k, n *= (k + 1);
	/*for (int i = 0; i < n; i++)
		for (int j = 0, maxj = S[i].size(); j < maxj; j++)
			printf("S[%d][%d] = %d\n", i, S[i][j].t, S[i][j].l);*/
	dijkstra();
	/*for (int i = 0; i < n; i++)
		printf("%d %d\n", i, ll[i]);
	putchar('\n');*/
	printf("%d\n", ll[t]);
	return 0;
} 
2024/9/29 16:56
加载中...