next_permutationとワーシャルフロイド法(ABC 073 D問題)
・ダイクストラ法:単一始点 O(E * logV)
・ワーシャルフロイド法:全点 O(V^3)
問題
以下ネタバレ注意
・ワーシャルフロイド法:全点 O(V^3)
問題
以下ネタバレ注意
- ll dist[201][201];
- int N, M, R;
- int r[9];
- int main() {
- cin >> N >> M >> R;
- REP(i, N) {
- REP(j, N) {
- dist[i][j] = INF;
- }
- }
- REP(i, R) {
- int k;
- cin >> k;
- r[i] = k - 1;
- }
- REP(i, M) {
- int a, b, c;
- cin >> a >> b >> c;
- dist[a-1][b-1] = c;
- dist[b-1][a-1] = c;
- }
- REP(k, N) { //kが中継点
- REP(i, N) {
- REP(j, N) {
- dist[i][j] = min(dist[i][j], (dist[i][k] + dist[k][j]));
- }
- }
- }
- vector<int> v(R);
- REP(i, R) {
- v[i] = r[i];
- }
- VSORT(v);
- ll ans = INF;
- do {
- ll cnt = 0;
- REP(i, R - 1) {
- cnt += dist[v[i]][v[i+1]];
- }
- ans = min(ans, cnt);
- } while (next_permutation(v.begin(), v.end())); // 次の順列を生成
- cout << ans << endl;
- return 0;
- }