首页 > 代码库 > poj 3411 Paid Roads (dfs)
poj 3411 Paid Roads (dfs)
题目链接
题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的。
每条路是要花费的。每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c城市,那么这条
路上的花费为P也可以为R。2:如果没有经过c,则这条路上的花费为R。问从城市1到城市n最小的花费是多少.
思路:存在走多次边的情况,所以vis[]数组可以多次,但是这个题目的多次的上限为3(不知道为什么)。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <vector> 7 #include <algorithm> 8 #define LL long long 9 using namespace std;10 const int maxn = 20+10;11 const int INF = 1<<28;12 int n, m, vis[maxn], ans;13 struct node14 {15 int b, c, p, r;16 }tmp;17 vector<node>v[maxn];18 19 void dfs(int x, int cost)20 {21 vis[x] ++;22 if(cost >= ans) return;23 if(x == n)24 {25 ans = cost;26 return;27 }28 int t, b1;29 for(int i = 0; i < v[x].size(); i++)30 {31 b1 = v[x][i].b;32 if(vis[b1]<=3)33 {34 t = INF;35 if(vis[v[x][i].c])36 t = v[x][i].p;37 if(t > v[x][i].r)38 t = v[x][i].r;39 dfs(b1, cost+t);40 vis[b1] --;41 }42 }43 }44 int main()45 {46 int i;47 int a1, b1, c1, p1, r1;48 while(~scanf("%d%d", &n, &m))49 {50 ans = INF;51 memset(vis, 0, sizeof(vis));52 for(i = 0; i < m; i++)53 {54 cin>>a1>>b1>>c1>>p1>>r1;55 tmp.b = b1; tmp.c = c1;56 tmp.p = p1; tmp.r = r1;57 v[a1].push_back(tmp);58 }59 dfs(1, 0);60 if(ans == INF) cout<<"impossible"<<endl;61 else cout<<ans<<endl;62 }63 return 0;64 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。