//回溯解法1

 

#include <iostream>
#include <vector>
#include <unordered_set>
#define  inf INT_MAX


using namespace std;

#define n 4
vector<int> state(4,-1);//想着第i步记录第i个城市,发现这样计算时间复杂度更高,换成unordered_map


typedef unordered_set<int> usti;
 usti node{0,1,2,3};

vector<vector<int>> dist={{0,5,9,4},
          {5,0,13,2},
          {9,13,0,7},
          {4,2,7,0}};


int cur_dist=0;
int min_dist=inf;
int beg_node=0;//出发节点,可以变更的
void solve(int st,usti  nod)
{
    usti node =nod;
    node.erase(st);
    state[n-node.size()]=st;
    if(node.empty())
    {
        if(dist[st][beg_node]<inf and min_dist>cur_dist+dist[st][beg_node])
            min_dist=cur_dist+dist[st][beg_node];
    }
    for(usti::iterator it=node.begin();it!=node.end();it++)
    {
        if(dist[st][*it]<inf&&cur_dist+dist[st][*it]<min_dist)
        {
            cur_dist+=dist[st][*it];
            solve(*it,node);
            cur_dist-=dist[st][*it];//当前层次换元素重新迭代
        }


    }

}

int main() {

    //vector<int> state(4,-1);
    solve(beg_node,node);
    cout<<min_dist;
    std::cout << "Hello, World!" << std::endl;
    return 0;
}