重新安排行程
回溯遍历(超时)
回溯遍历每一种可能
当出现第一种可能的路线,之间加入。
当出现新的可能路线,与老路线对比,如果字典排序小于,则替换老路线
class Solution { public: vector<string> resul; vector<string> path; void backtraking(vector<vector<string>>& tickets , string Indnx , vector<bool> &used) { //找到路线,看是否替换老的路径 //如果没有老路径直接加入,如果相同就返回,如果不同路径按照字典比较 if(path.size()==tickets.size()+1) { if(resul.empty()==1) { resul = path; return; } else if(resul == path) return; else { for(int j=0 ;j<path.size();j++) { for(int k=0 ;k<3;k++) { if(resul[j][k] == path[j][k]) continue; else if(resul[j][k] < path[j][k])return; else if(resul[j][k] > path[j][k]) { resul.clear(); resul = path; return; } } } } // cout<<"resu: "; // for(auto i:resul) cout<<i<<' '; // cout<<endl; return; } for(int i=0 ; i<tickets.size();i++) { //如果当前机票使用过,或者当前机票目的地不对,跳过 if(used[i]==true || tickets[i][0] != Indnx) continue; //如果当前机票可用,则加入路径 if(used[i]== false && tickets[i][0] == Indnx) { used[i] = true; path.push_back(tickets[i][1]); //递归,确定递归找的新机票。下一站机票的开始机场,就是当前机票的目的地机场 backtraking(tickets,tickets[i][1],used); used[i] = false; path.pop_back(); } } return; } vector<string> findItinerary(vector<vector<string>>& tickets) { vector<bool> used(tickets.size(),false); path.push_back("JFK"); backtraking(tickets,"JFK",used); return resul; } };
排序再回溯
先对输入票排序,其中排序按照票的目的地的字典减少排序(因为出发点是确定的,目的地多种找最优解)
之后回溯遍历找路线,发现的第一个路线即为最优路线
class Solution { public: //按飞机票目的地(字符串vector第二个参数)字典减小排序 class compare { public: bool operator()( const vector<string> tickets1 ,const vector<string> tickets2 ) { if((tickets1[1])[0] < (tickets2[1])[0]) return 1; else if((tickets1[1])[0] == (tickets2[1])[0]) { if((tickets1[1])[1] < (tickets2[1])[1]) return 1; else if((tickets1[1])[1] == (tickets2[1])[1]) { if((tickets1[1])[2] < (tickets2[1])[2]) return 1; else return 0; } return 0; } return 0; } }; vector<string> resul; vector<string> path; bool find = false; void backtraking(vector<vector<string>>& tickets , string Indnx , vector<bool> &used) { //找到一个路径就不找了,直接是最优路径 if(find == true ) return; if(path.size()==tickets.size()+1) { resul = path; find =true; return; } for(int i=0 ; i<tickets.size();i++) { if(used[i]==true || tickets[i][0] != Indnx) continue; if(used[i]== false && tickets[i][0] == Indnx) { used[i] = true; path.push_back(tickets[i][1]); backtraking(tickets,tickets[i][1],used); used[i] = false; path.pop_back(); } } return; } vector<string> findItinerary(vector<vector<string>>& tickets) { vector<bool> used(tickets.size(),false); sort(tickets.begin(),tickets.end(),compare()); // for(auto i:tickets) // { // cout<<'['; // for(auto j:i) // { // cout<<j<<' '; // } // cout<<']'; // } path.push_back("JFK"); backtraking(tickets,"JFK",used); return resul; } };