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

来源:互联网 发布:全球主权财富基金知乎 编辑:程序博客网 时间:2024/05/18 19:47

题意:给出一个图,求从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;}

0 0
原创粉丝点击