mooyyu

G11 - ShortestPath-Floyd

c++11 graph algorithm

template< class type >
class FP {
	const int n;
public:
	const int INF = numeric_limits< type >::max() >> 1u;
	int ar[maxn + 1][maxn + 1] {};
	explicit FP(const int n): n(n) {
		for (int i = 1; i <= n; i++) {
			fill(ar[i] + 1, ar[i] + n + 1, INF);
			ar[i][i] = 0;
		}
	}
	void solve() {
		for (int k = 1; k <= n; k++)
			for (int i = 1; i <= n; i++)
				if (ar[i][k] != INF)
					for (int j = 1; j <= n; j++)
						if (ar[k][j] != INF)
							ar[i][j] = min(ar[i][k] + ar[k][j], ar[i][j]);
	}
};

Notes

  • INF会被负权边更新, 所以判断连通时不能用相等判断(负权图通病)
  • 存图时注意处理重边(邻接矩阵通病)