poj 3311 Hie with the Pie ,floyd + 枚舉排列

題意:給出一個圖,求從0開始走,經過所有節點再回到0的最小時間。

先用floyd處理一遍,找出兩個點之間的最短路徑,然後枚舉排列找最小值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mp[11][11];
int v[20];
int main() {
    int n, i, j, k;
    while(~scanf("%d", &n) && n) {
        for(i = 0; i <= n; i++) {
            for(j = 0; j <= n; j++)
                scanf("%d", &mp[i][j]);
        }
        for(i = 0; i <= n; i++) {
            for(j = 0; j <= n; j++) {
                for(k =0 ; k <= n; k++) {
                    if(mp[j][k] > mp[j][i] + mp[i][k])
                        mp[j][k] = mp[j][i] + mp[i][k];
                }
            }
        }
        for(i = 0; i <= n; i++) {
            v[i] = i;
        }
        int ans = 0x3f3f3f3f;
        do{
            int t = 0;
            for(i = 1; i <= n; i++) {
                t += mp[v[i - 1]][v[i]];
            }
            t += mp[v[n]][0];
            if(t < ans)
                ans = t;
        }while(next_permutation(v + 1, v + 1 + n));
        printf("%d\n", ans);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章