CF1442C Graph Transpositions 比正确答案大了1

image

做到最后,应该都知道把19步转置以上的分层图压缩掉
我偷懒,把所有信息都压缩在dis[19][x]里面,于是这样会在找最短路的过程中把步数信息覆盖,于是答案会大1

解决方案:
把步数分成奇数步和偶数步就可以保证上一步的信息不被覆盖了

	if (ans != lINF) { cout << ans << endl; return; }
	ffp(i, 1, n-1)
	{
		dui.push({ dis[18][i],18,i });
	}
	vector<vector<ll>>A(2, vector<ll>(n + 2, lINF));

	while (dui.size())
	{
		auto [va, dp, now] = dui.top(); dui.pop();
		int jiou = (dp & 1);
		if (A[jiou][now] < va) { continue; }
		A[jiou][now] = va;
		for (auto e : tr0[now])
		{
			int pls = 0;
			if (dp & 1) { pls = 1; }
			if (A[jiou^pls][e] > va + 1 + (pls ? 100000000 : 0))
			{
				A[jiou ^ pls][e] = va + 1 + (pls ? 100000000 : 0);
				dui.push({ A[jiou ^ pls][e] ,dp+pls,e });
			}
		}
		for (auto e : tr1[now])
		{
			int pls = 0;
			if ((dp & 1)==0) { pls = 1; }
			if (A[jiou ^ pls][e] > va + 1 + (pls ? 100000000 : 0))
			{
				A[jiou ^ pls][e] = va + 1 + (pls ? 100000000 : 0);
				dui.push({ A[jiou ^ pls][e] ,dp + pls,e });
			}
		}
	}
	ll temp = min(A[0][n], A[1][n]);;
	ans = temp % 100000000;
	for (int i = 18; i <= 17 + temp / 100000000; i++)
	{
		ans += mi[i];
	}
	cout << ans%MOD<< endl;
posted @ 2025-10-13 16:28  粉紫系超人气月兔铃仙  阅读(4)  评论(0)    收藏  举报