POJ 3411 Paid Roads(DFS)
2017-02-08 13:58
393 查看
【题目链接】 http://poj.org/problem?id=3411
【题目大意】
从a到b的路,如果已经访问过c那么路费为p否则为r,问从1到n的最短路
【题解】
搜索记录每个点在该回溯中被访问的次数,
因为这张图最多只有十个点,所以如果一个点被访问的次数超过3,
那么一定是重复走环路了,可证明重复走环路答案一定不是最优的因此可以停止继续搜索这个点。
【代码】
【题目大意】
从a到b的路,如果已经访问过c那么路费为p否则为r,问从1到n的最短路
【题解】
搜索记录每个点在该回溯中被访问的次数,
因为这张图最多只有十个点,所以如果一个点被访问的次数超过3,
那么一定是重复走环路了,可证明重复走环路答案一定不是最优的因此可以停止继续搜索这个点。
【代码】
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; int n,m,vis[20],ans; struct data{int a,b,c,p,r;}u[20]; void dfs(int a,int w){ if(a==n&&ans>w){ans=w;return;} for(int i=1;i<=m;i++){ if(a==u[i].a&&vis[u[i].b]<=3){ int b=u[i].b; vis[b]++; if(vis[u[i].c])dfs(b,w+u[i].p); else dfs(b,w+u[i].r); vis[b]--; } }return; } int main(){ while(~scanf("%d%d",&n,&m)){ memset(vis,0,sizeof(vis)); vis[1]=1; ans=INF; for(int i=1;i<=m;i++)scanf("%d%d%d%d%d",&u[i].a,&u[i].b,&u[i].c,&u[i].p,&u[i].r); dfs(1,0); if(ans==INF)puts("impossible"); else printf("%d\n",ans); }return 0; }
相关文章推荐
- 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(SPFA || DFS)
- POJ 3411 Paid Roads(dfs)
- POJ 3411 Paid Roads(DFS)
- poj 3411Paid Roads(走重复点的dfs )
- Poj 3411 Paid Roads【Dfs】
- POJ 3411 Paid Roads 简单DFS