POJ-2197(DFS)

来源:互联网 发布:服装淘宝产品验收标准 编辑:程序博客网 时间:2024/06/06 06:46

题目:http://poj.org/problem?id=2197

分析:要输出全部符合的路径,肯定是暴搜+剪枝,先对每个节点的邻居按标号排个序,这样dfs的路径就自然是字典序的了。


#include <cstdio>#include <utility>#include <vector>#include <algorithm>using namespace std;#define MAX_NODE25#define MAX_DIST10005typedef pair<int,int> PII;int N, M, S, E, D;vector<int> path;bool vis[MAX_NODE];vector<PII> neighbour[MAX_NODE];vector<vector<int> > routes[MAX_DIST];bool init(){if(scanf("%d", &N), N == -1) return false;scanf("%d", &M);int i, x, y, d;for(i = 1; i <= N; ++i){vis[i] = false;neighbour[i].clear();}for(i = 0; i < M; ++i){scanf("%d%d%d", &x, &y, &d);neighbour[x].push_back(PII(y, d));neighbour[y].push_back(PII(x, d));}for(i = 1; i <= N; ++i) sort(neighbour[i].begin(), neighbour[i].end());scanf("%d%d%d", &S, &E, &D);for(i = 0; i <= D; ++i) routes[i].clear();return true;}void dfs(int x, int dis){path.push_back(x);vis[x] = true;if(x != E){const vector<PII> v = neighbour[x];for(int i = 0; i < v.size(); ++i){int y = v[i].first, d = v[i].second;if(vis[y] || dis + d > D) continue;dfs(y, dis + d);}}else routes[dis].push_back(path);vis[x] = false;path.pop_back();}void work(){dfs(S, 0);bool ok = false;for(int i = 0; i <= D; ++i){for(int j = 0; j < routes[i].size(); ++j){ok = true;vector<int>& v = routes[i][j];printf(" %d: ", i);for(int k = 0; k < v.size(); ++k) printf("%d ", v[k]);puts("");}}if(!ok) puts(" NO ACCEPTABLE TOURS");}int main(){int kase = 0;while(init()){printf("Case %d:\n", ++kase);work();puts("");}return 0;}


0 0
原创粉丝点击