poj 3411 Paid Roads (dfs)
2014-07-25 20:07
543 查看
题目链接
题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的。
每条路是要花费的。每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c城市,那么这条
路上的花费为P也可以为R。2:如果没有经过c,则这条路上的花费为R。问从城市1到城市n最小的花费是多少.
思路:存在走多次边的情况,所以vis[]数组可以多次,但是这个题目的多次的上限为3(不知道为什么)。
题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的。
每条路是要花费的。每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c城市,那么这条
路上的花费为P也可以为R。2:如果没有经过c,则这条路上的花费为R。问从城市1到城市n最小的花费是多少.
思路:存在走多次边的情况,所以vis[]数组可以多次,但是这个题目的多次的上限为3(不知道为什么)。
#include <iostream> #include <cstring> #include <cstdlib> #include <cmath> #include <cstdio> #include <vector> #include <algorithm> #define LL long long using namespace std; const int maxn = 20+10; const int INF = 1<<28; int n, m, vis[maxn], ans; struct node { int b, c, p, r; }tmp; vector<node>v[maxn]; void dfs(int x, int cost) { vis[x] ++; if(cost >= ans) return; if(x == n) { ans = cost; return; } int t, b1; for(int i = 0; i < v[x].size(); i++) { b1 = v[x][i].b; if(vis[b1]<=3) { t = INF; if(vis[v[x][i].c]) t = v[x][i].p; if(t > v[x][i].r) t = v[x][i].r; dfs(b1, cost+t); vis[b1] --; } } } int main() { int i; int a1, b1, c1, p1, r1; while(~scanf("%d%d", &n, &m)) { ans = INF; memset(vis, 0, sizeof(vis)); for(i = 0; i < m; i++) { cin>>a1>>b1>>c1>>p1>>r1; tmp.b = b1; tmp.c = c1; tmp.p = p1; tmp.r = r1; v[a1].push_back(tmp); } dfs(1, 0); if(ans == INF) cout<<"impossible"<<endl; else cout<<ans<<endl; } return 0; }
相关文章推荐
- 多次访问节点的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(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技巧)
- POJ 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads(DFS)