分层图最短路45pts求调
查看原帖
分层图最短路45pts求调
300098
cmaths楼主2022/8/18 07:06
#include <cstdio>
#include <cstring>
#include <queue>
#define int long long

using namespace std;

const int N = 10000, M = 50000, K = 10;
struct Edge
{
	int u, v, w, nxt;
}edge[4 * M * (K + 1) + 5];
int head[N * (K + 2) + 5], cnt;
void add(int u, int v, int w)
{
	edge[++cnt].u = u;
	edge[cnt].v = v;
	edge[cnt].w = w;
	edge[cnt].nxt = head[u];
	head[u] = cnt;
}
struct Node
{
	int ind, Dis;
	bool operator < (const Node &x) const
	{
//		return Dis < x.Dis;
		return x.Dis < Dis;
	}
};
int dis[N * (K + 2) + 5], vis[N * (K + 2) + 5];
priority_queue <Node> q;
void dijkstra(int s)
{
	memset(dis, 0x3f, sizeof(dis));
	dis[s] = 0;
	q.push((Node){s, 0});
	while(q.size())
	{
		Node tem = q.top();
		q.pop();
		if(vis[tem.ind])
		{
			continue;
		}
		vis[tem.ind] = 1;
		for(int i = head[tem.ind]; i; i = edge[i].nxt)
		{
			int v = edge[i].v;
			if(!vis[v] && tem.Dis + edge[i].w < dis[v])
			{
				dis[v] = tem.Dis + edge[i].w;
				q.push((Node){v, dis[v]});
			}
		}
	}
}
signed main()
{
	int n, m, k, s, t;
	scanf("%lld %lld %lld %lld %lld", &n, &m, &k, &s, &t);
	for(int i = 1; i <= m; i++)
	{
		int u, v, w;
		scanf("%lld %lld %lld", &u, &v, &w);
		add(u, v, w);
		add(v, u, w);
		for(int j = 1; j <= k; j++)
		{
			add(u + (j - 1) * n, v + j * n, 0);
			add(u + (j - 1) * n, v + j * n, 0);			
			add(u + j * n, v + j * n, w);
			add(v + j * n, u + j * n, w);
		}
	}
	for(int i = 1; i <= k; i++)
	{
		add(t * i, t * (i + 1), 0);
	}
	dijkstra(s);
	printf("%lld", dis[t + k * n]);
	return 0;
}

rt

2022/8/18 07:06
加载中...