CF1442C Graph Transpositions 比正确答案大了1

做到最后,应该都知道把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;

浙公网安备 33010602011771号