分层图求调,样例都没过qwq,玄关
查看原帖
分层图求调,样例都没过qwq,玄关
521554
Wing_Din_Gaster楼主2025/2/3 10:33

蒟蒻求调,用的分层图+Dijkstra

只有10pts,#7 (输出-1) AC,#1,2,8~10 WA,#3~6 RE(signal 11 Segmentation Fault)

样例输出7, std: 4

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000, MAXK = 999, INF = 0x3f3f3f3f;
int n, p, k, a, b, l;
struct Edge
{
	int v, w;
};
inline int get_node_id(const int &u, const int &k) { return k * (n + 1) + u; }
vector<Edge> e[(MAXN + 5) * (MAXK + 5)];
inline void addEdge(const int &u, const int &v, const int &w, const int &k)
{
	for (int i = 0; i < k; ++i)
		e[get_node_id(u, i)].push_back({get_node_id(v, i), w});
	for (int i = 1; i < k; ++i)
		e[get_node_id(u, i - 1)].push_back({get_node_id(v, i), 0});
}
int dist[MAXN];
bool vis[MAXN];

void dijkstra(const int &start, const int &N)
{
	memset(dist, 0x3f, sizeof dist);
	dist[start] = 0;
	typedef pair<int, int> Node;
	priority_queue<Node, vector<Node>, greater<Node>> pq;
	pq.push({start, 0});
	while (!pq.empty())
	{
		auto now = pq.top();
		pq.pop();
		int u = now.first, d = now.second;
		if (vis[u])
			continue;
		vis[u] = true;
		for (const auto &i : e[u])
		{
			if (dist[i.v] > max(d, i.w))
			{
				dist[i.v] = max(d, i.w);
				pq.push({i.v, dist[i.v]});
			}
		}
	}
}
signed main()
{
	cin >> n >> p >> k;
	for (int i = 0; i < p; ++i)
	{
		cin >> a >> b >> l;
		addEdge(a, b, l, k);
		addEdge(b, a, l, k);
	}
	dijkstra(1, n);
	int ans = dist[n];
	for (int i = 1; i < k; ++i)
		ans = min(ans, dist[get_node_id(n, i)]);
	cout << (ans == INF ? -1 : ans) << endl;
	return 0;
}
2025/2/3 10:33
加载中...