数据太水了!!!
查看原帖
数据太水了!!!
185726
RuSun楼主2021/5/5 17:07

spfa 将元素取出队列的时候应该把 vis 赋值为 false, 表示不在队列里, 但是我打成了 true, 竟然过了。 然后复制了这个题的代码, 在下一个题 wa 了才发现我打错了。

数据真水!

#include <iostream>
#include <cstdio>
#include <queue>
#include <climits>
#define inf INT_MAX
using namespace std;
typedef pair <int, int> PII;
const int N = 60, M = 2e3 + 10;
bool vis[N][N];
int n, m, k, d[N][N];
int idx = -1, hd[N], nxt[M], edg[M], wt[M];
void spfa ()
{
	for (int i = 1; i <= n; i++)
		for (int j = 0; j <= k; j++)
			d[i][j] = inf;
	d[1][k] = 0;
	queue <PII> q;
	q.push(make_pair(1, k));
	vis[1][k] = true;
	while (!q.empty())
	{
		PII t = q.front();
		q.pop();
		vis[t.first][t.second] = true;
		for (int i = hd[t.first]; ~i; i = nxt[i])
		{
			if (d[t.first][t.second] + wt[i] < d[edg[i]][t.second])
			{
				d[edg[i]][t.second] = d[t.first][t.second] + wt[i];
				if (!vis[edg[i]][t.second])
				{
					q.push(make_pair(edg[i], t.second));
					vis[edg[i]][t.second] = true;
				}
			}
			if (d[t.first][t.second] + wt[i] / 2 < d[edg[i]][t.second - 1] && t.second)
			{
				d[edg[i]][t.second - 1] = d[t.first][t.second] + wt[i] / 2;
				if (!vis[edg[i]][t.second - 1])
				{
					q.push(make_pair(edg[i], t.second - 1));
					vis[edg[i]][t.second - 1] = true;
				}
			}
		}
	}
}
void add (int a, int b, int c)
{
	nxt[++idx] = hd[a];
	hd[a] = idx;
	edg[idx] = b;
	wt[idx] = c;
}
int main ()
{
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++)
		hd[i] = -1;
	for (int i = 1, a, b, c; i <= m; i++)
	{
		cin >> a >> b >> c;
		add(a, b, c);
		add(b, a, c);
	}
	spfa();
	int res = inf;
	for (int i = 0; i <= k; i++)
		res = min(res, d[n][i]);
	cout << res;
	return 0;
}
2021/5/5 17:07
加载中...