TSP問題
Time Limit: 5000 ms Memory Limit: 65535 KBTotal Submit: 163 Accepted: 83
接下來的n行,每行輸入n-1個整數xj(0<xj<=500),表示i與除了自己之外的所以點之間的距離,按點的編號從小到大的順序輸入。
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
10
#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;
}