Firetruck UVA

来源:互联网 发布:海蓝之谜淘宝旗舰店 编辑:程序博客网 时间:2024/06/07 07:54

利用并查集首先判断当前是否有解,然后深搜,每次得到结果就进行保存,然后统一输出即可,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>using namespace std;int k;vector<vector<int>> path;bool visit[21];int root[30];void dfs(int start,vector<int> road[],vector<int>& cur_path){if (start == k){cur_path.push_back(start);path.push_back(cur_path);cur_path.pop_back();return;}visit[start] = true;cur_path.push_back(start);for (int i = 0; i < road[start].size(); i++){int ind = road[start][i];if (visit[ind]) continue;dfs(ind, road, cur_path);}visit[start] = false;cur_path.pop_back();}int find_root(int i){if (root[i] == i) return i;int r = i;while (root[r] != r)r = root[r];while (root[i] != r){int j = root[i];root[i] = r;i = j;}return r;}void join(int i,int j){int a = find_root(i);int b = find_root(j);root[a] = b;}int main(){int Case = 1;while (cin >> k){path.clear();int a, b;memset(visit, false, sizeof(visit));vector<int> road[21];for (int i = 0; i < 30; i++) root[i] = i;while (cin >> a >> b){if (a == 0 && b == 0) break;road[a].push_back(b);road[b].push_back(a);join(a,b);}cout << "CASE " << Case++ << ":" << endl;if (find_root(1) == find_root(k)){vector<int> cur;dfs(1, road, cur);sort(path.begin(), path.end());for (int i = 0; i < path.size(); i++){for (int j = 0; j < path[i].size() - 1; j++){cout << path[i][j] << " ";}cout << path[i][path[i].size() - 1] << endl;}}cout << "There are "<<path.size()<<" routes from the firestation to streetcorner "<<k<<"." << endl;}return 0;}

原创粉丝点击