加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 3311 Folyd 枚举

(2010-09-21 17:30:58)
标签:

poj

3311

folyd

枚举

it

分类: 图论

题目描述:

有n个地点(n <= 10),告诉你他们之间的距离。问你从1出发经历所有的地点后再回到1.最短的距离是多少。

解题报告:

folyd枚举任意两点的最短路。

全排列n个数字。

每次排列当做一个合法的回路。

所有解得最小值就是答案。

代码如下:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, g[11][11];
int main()
{
    while(scanf("%d", &n) && n)
    {
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= n; j++)scanf("%d", &g[i][j]);
        for(int k = 0; k <= n; k++)
            for(int i = 0; i <= n; i++)
                for(int j = 0; j <= n; j++)
                    g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
        vector<int> jeo;for(int i = 1; i <= n; i++) jeo.push_back(i);
        int ans = -1;
        do
        {
            int tmp = g[0][jeo[0]];
            for(int i = 1; i < n; i++) tmp += g[jeo[i - 1]][jeo[i]];
            tmp += g[jeo[n - 1]][0];
            if (ans == -1 || tmp < ans) ans = tmp;
        }while(next_permutation(jeo.begin(), jeo.end()));
        printf("%d\n", ans);
    }
    return 0;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有