我正在用动态方法实施旅行商问题。我在下面添加了我的尝试。在大多数情况下,代码已编译并给出正确的输出。但是,当我有矩阵表示形式[[0,10,1],[1,0,10],[10,1,0]]时,它失败了。我希望结果为3,但显示为30。
我已经进行了递归调用,并且字典映射存储了要存储的密钥。
#include<bits/stdc++.h>
using namespace std;
int v;
int G[10][10];
int parent[10];
map<pair<int,set<int> >, int > dict;
void solve(int,set<int>);
int tsp(int,set<int>);
int main(){
set<int> s,s_o;
set<int>::iterator it;
cout<<"Give number of vertices"<<endl;
cin>>v;
for(int i=0;i<v;i++)
s.insert(i);
//cout<<"Give number of edges"<<endl;
//cin>>e;
s_o=s;
cout<<"Give edges"<<endl;
for(int i=0;i<v;i++){
for(int j=0;j<v;j++){
cin>>G[i][j];
}
}
solve(0,s);
return 0;
}
void solve(int i,set<int> s){
parent[i]=-1;
set<int>::iterator it;
it=s.find(i);
s.erase(it);
// for(it=s.begin();it!=s.end();++it)
// cout<<*it<<" ";
int ans=tsp(0,s);
cout<<ans<<endl;
for(int i=0;i<v;i++)
cout<<parent[i]<<" ";
cout<<endl;
}
int tsp(int a,set<int>s){
set<int>::iterator it;
int min_cost=1000000;
int k,min_k;
if(s.empty()){
return G[a][0];
}
for(it=s.begin();it!=s.end();++it){
k=*it;
s.erase(it);
if(dict.find(pair<int, set<int> >(k,s))!=dict.end()){
//cout<<"here"<<endl;
return G[a][k]+ dict.at(pair<int, set<int> >(k,s));
}
else{
if(tsp(k,s)<min_cost){
min_cost=tsp(k,s);
min_k=k;
}
pair<int,set<int> > x(k,s);
dict.insert(pair<pair<int, set<int> >,int >(x,min_cost));
parent[a]=min_k; //i must admit that this is accidental, but
//it worked xD
return G[a][k]+min_cost;
}
}
}
我也希望父数组可以保存顶点的父元素,而-1可以保存source(以防万一)。 tsp()函数有什么问题吗?如果不是,为什么给出的答案是30? 另外,父数组使用有什么问题?
谢谢您的帮助! :)