为什么该TSP代码在上述情况下失败,但在其他地方起作用?

时间:2019-03-27 14:59:21

标签: c++ graph-algorithm

我正在用动态方法实施旅行商问题。我在下面添加了我的尝试。在大多数情况下,代码已编译并给出正确的输出。但是,当我有矩阵表示形式[[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? 另外,父数组使用有什么问题?

谢谢您的帮助! :)

0 个答案:

没有答案