为什么我只有64分?
查看原帖
为什么我只有64分?
401641
_MJawa_楼主2022/4/24 22:23
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
const int N = 2e6 + 10;
const int M = 4e5 + 10;
const int MAX = INT_MAX - 1e6;
const int fx[] = {0, 0, -1, 1};
const int fy[] = {1, -1, 0, 0};
const long long INF = 1e18+17;
#define ull unsigned long long 
#define int long long
#define ri register
#define il inline

#define lowbit(x) x & -x
#define sr(x) ((x << 1) | 1)
#define sl(x) (x << 1)
#define mid ((l + r) >> 1)
#define fson 1, n, 1
#define lson l, mid, sr(k)
#define rson mid + 1, r, sl(k)
#define mpr make_pair

struct Edge {
	int to, nxt, val;
}edge[N * 10];
int head[N], num_edge;
void add_edge(int x, int y, int z) {
	edge[++ num_edge].to = y;
	edge[num_edge].val = z;
	edge[num_edge].nxt = head[x];
	head[x] = num_edge;
	return ;
}

int n, m, k, ks, js;
int dis[N];
bool vis[N];

priority_queue<pair<int ,int > > tea;

void work();

signed main(){
	cin >> n >> m >> k;
	cin >> ks >> js;
	for (int i = 1, tmpx, tmpy, tmpz; i <= m; ++ i) {
		scanf("%d%d%d", &tmpx, &tmpy, &tmpz);
		add_edge(tmpx, tmpy, tmpz);
		add_edge(tmpy, tmpx, tmpz);
		for (int j = 1; j <= k; ++ j) {
			tmpx += n;
			tmpy += n;
			add_edge(tmpx - n, tmpy, 0);
			add_edge(tmpy - n, tmpx, 0);
			add_edge(tmpx, tmpy, tmpz);
			add_edge(tmpy, tmpx, tmpz);
		}
	}
	for(int i = 1; i <= k; ++ i) {
		add_edge(js + (i - 1) * n, js + i * n, 0);
	}
	work();
	cout << dis[js + k * n];
	return 0;
}
void work() {
	for (int i = 1; i < N - 10; ++ i) {
		dis[i] = MAX;
	}
	dis[ks] = 0;
	tea.push(make_pair(0, ks));
	for (int now; !tea.empty(); ) {
		now = tea.top().second;
		tea.pop();
		if (vis[now])continue;
		vis[now] = true;
		for (int i = head[now], to, val; i; i = edge[i].nxt) {
			to = edge[i].to;
			val = edge[i].val;
			if (dis[to] > dis[now] + val) {
				dis[to] = dis[now] + val;
				tea.push(make_pair(-dis[to], to));
			}
		}
	}
	return ;
}
2022/4/24 22:23
加载中...