poj 3411 Paid Roads很水的DFS
2013-08-16 16:10
387 查看
题意:给你N 城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少。
直接DFS搜。
链接http://poj.org/problem?id=3411
代码:
View Code
直接DFS搜。
链接http://poj.org/problem?id=3411
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <stdlib.h> #include <vector> #include <queue> #include <stack> #define loop(s,i,n) for(i = s;i < n;i++) #define cl(a,b) memset(a,b,sizeof(a)) const int maxn = 521; const int inf = 99999999; using namespace std; struct node { int u,v,c,r,p; }; vector <struct node >g[15]; int vis[15]; int ans; int n,m; void dfs(int u,int val) { vis[u]++; if(u == n) { if(ans > val) ans = val; return ; } if(ans < val) return; int i; for(i = 0;i < g[u].size();i++) { int v; v = g[u][i].v; int c; c = g[u][i].c; if(vis[v] <= 3) { int min; min = inf; if(vis[c] && min > g[u][i].p) min = g[u][i].p; if(min > g[u][i].r) min = g[u][i].r; dfs(v,val+min); vis[v]--; } } } int main() { int u,v,t,p,r; while(~scanf("%d %d",&n,&m)) { int i,j; memset(vis,0,sizeof(vis)); for(i = 1;i <= n;i++) g[i].clear(); while(m--) { scanf("%d%d%d%d%d",&u,&v,&t,&p,&r); g[u].push_back((struct node){u,v,t,r,p}); } ans = inf; dfs(1,0); if(ans != inf) cout<<ans<<endl; else puts("impossible"); } return 0; }
View Code
相关文章推荐
- poj 3411 Paid Roads (dfs)
- POJ 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads(dfs技巧)
- 多次访问节点的DFS POJ 3411 Paid Roads
- poj 3411 Paid Roads -dfs
- poj 3411 Paid Roads(dfs)
- poj 3411 Paid Roads(DFS)
- poj 3411 Paid Roads 简单的dfs
- POJ 3411 Paid Roads(DFS)
- Poj 3411 Paid Roads (DFS 特殊标记方法)
- poj 3411 Paid Roads(dfs)
- POJ 3411 Paid Roads(SPFA || DFS)
- POJ 3411 Paid Roads(dfs)
- POJ 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads 简单DFS
- poj 3411 Paid Roads (dfs)
- POJ 3411 Paid Roads (DFS多次访问节点)
- poj_3411 Paid Roads(dfs技巧)
- poj 3411 Paid Roads(dfs,可重复访问节点)
- POJ 3411-Paid Roads(DFS)