POJ 3411 Paid Roads (DFS多次访问节点)

来源:互联网 发布:win10 usb共享网络 编辑:程序博客网 时间:2024/05/16 02:36

题意:n座城市由m条公路连接,每两座城市间可能有多条公路。这些公路都是需要收费的,并且有两种付费方式。例如从a到b:方式一在b处付费 r ;方式二在a之前(可能包含a)付费p,但是用方式二付费要求路径必须经过c点。要求从1到n得最小费用。
题解:题目只要求最小费用,由于有重边的存在,可能有的节点会被访问多次。所以确定每个节点的访问次数上限是关键。本题总貌似取3就可以了。

#include <vector>#include <iostream>using namespace std;#define N 11#define INF 99999struct NODE{int v, c, p, r;} temp;int vis[N], ans, n, m;vector<NODE> node[N]; void dfs ( int u, int cost ){vis[u]++;if ( cost >= ans ) return;if ( u == n ){if ( ans > cost ) ans = cost;return;}int i, v, t;for ( i = 0; i < node[u].size(); i++ ){v = node[u][i].v;if ( vis[v] <= 3 ) // 亮点···{t = INF;if ( vis[node[u][i].c] && node[u][i].p < t ) t = node[u][i].p;if ( node[u][i].r < t )t = node[u][i].r;dfs ( v, t + cost );    vis[v]--;}}}int main(){int a, b, c, p, r;scanf("%d%d",&n,&m);memset(vis,0,sizeof(vis));while ( m-- ){scanf("%d%d%d%d%d",&a,&b,&c,&p,&r);temp.v = b;temp.c = c;temp.p = p;temp.r = r;node[a].push_back(temp);}ans = INF;dfs ( 1, 0 );if ( ans != INF ) printf("%d\n",ans);else printf("impossible\n");return 0;}


原创粉丝点击