Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。
・問題 "Traveling Salesman Problem"
https://onlinejudge.u-aizu.ac.jp/problems/DPL_2_A
・巡回セールスマン問題
僕が作成、提出したコードは、以下のとおりです。
Aizu Online Judge in C++ #DPL_2_A : Traveling Salesman Problem
/* Aizu Online Judge in C++ #DPL_2_A : Traveling Salesman Problem https://onlinejudge.u-aizu.ac.jp/problems/DPL_2_A 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; using ll=long long; const ll inf=1e17; int main(void){ ll v,e; cin>>v>>e; vector<vector<ll>> d(v,vector<ll>(v,inf)); for(ll i=0;i<e;i++){ ll s,t,D; cin>>s>>t>>D; d[s][t]=D; } vector<vector<ll>> dp(1<<v,vector<ll>(v,inf)); dp[0][0]=0; for(ll i=0;i<(1<<v);i++){ for(ll j=0;j<v;j++){ for(ll k=0;k<v;k++){ if(!(i&(1<<k))){ dp[i|(1<<k)][k]=min(dp[i|(1<<k)][k],dp[i][j]+d[j][k]); } } } } cout<<(dp[(1<<v)-1][0]==inf ? -1 : dp[(1<<v)-1][0])<<endl; return 0; }
設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/