This documentation is automatically generated by online-judge-tools/verification-helper
#include "number/min_plus_semiring.hpp"
加法を min
,乗法を +
で定義した半環.零元は std::numeric_limits<T>::max() / 2
(オーバーフロー回避),単位元は 0
となっていることに注意.例えば距離行列に載せて行列積をとることで,パス長最小化等に使用できる.
なお,(当たり前ではあるが)零元と任意の値(正負に関わらず)との乗算の結果は零元になることに注意.
using R = min_plus_semiring<int>;
matrix<R> mat(N, N);
while (M--) {
int a, b;
cin >> a >> b;
mat[b][a] = 0;
}
std::vector<R> initvec(N, R()); // R() == INF
initvec[0] = R::id(); // R::id() == 0
auto vec = mat.pow_vec(T, initvec);
cout << count(vec.begin(), vec.end(), R(0)) << '\n';