TSP 動態規劃

TSP問題

Time Limit: 5000 ms     Memory Limit: 65535 KB
Total Submit: 163     Accepted: 83 

Description
旅行商問題,即TSP問題(Travelling Salesman Problem)又譯爲旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程爲所有路徑之中的最小值。

Input
第一行輸入一個整數n(2<=n<=15)。
接下來的n行,每行輸入n-1個整數xj(0<xj<=500),表示i與除了自己之外的所以點之間的距離,按點的編號從小到大的順序輸入。

Output
輸出一行,就是所有路徑之中的最小值。

Sample Input
5
3 1 5 8
3 6 7 9
1 6 4 2
5 7 4 3
8 9 2 3
4
3 6 7
5 2 3
6 4 2
3 7 5

Sample Output
16
10



這段代碼的集合使用二進制來表示的,需要注意的就是集合的枚舉順序。由於是用二進制表示的,則可以發現這樣一個規律,如果a是b的真子集,則相對應的二進制數一定有a<b。因此若以集合遞增的順序計算,需要用到某個d值是,它一定是在之前已經計算出來的。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include<map>
#define pi acos(-1.0)
#define eps 1e-6
#define inf 1<<30
#define INF 1ll<<60
#define ll long long
using namespace std;
int n;
int maps[20][20];
int d[20][1<<16];
int main()
{
    int a;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(i==j)
                {
                    maps[i][i]=inf;
                    continue;
                }
                int a;
                cin>>a;
                maps[i][j]=a;
            }
        }
        for(int i=0; i<n; i++)
            for(int s=0; s<(1<<n); s++)
                d[i][s]=inf;
        for(int s=0; s<(1<<n-1); s++)
        {

            for(int i=0; i<n; i++)
            {
                 if(s==0)
                d[i][s]=maps[i][0];
                for(int j=1; j<n; j++)
                {
                    if(s&(1<<(j-1)))
                        d[i][s]=min(d[i][s],d[j][s^(1<<(j-1))]+maps[i][j]);
                }
            }
        }
//        for(int i=0; i<n; i++)
//        {
//            for(int s=0; s<(1<<(n-1)); s++)
//
//                cout<<d[i][s]<<" ";
//            cout<<endl;
//        }
        cout<<d[0][(1<<n-1)-1]<<endl;
    }
    return 0;
}




發佈了40 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章