POJ 3411 Paid Roads(DFS)

Posted forever97‘s blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3411 Paid Roads(DFS)相关的知识,希望对你有一定的参考价值。

 

【题目链接】 http://poj.org/problem?id=3411

 

【题目大意】

  从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

Paid Roads POJ

[Poj] Roads in the North

ROADS POJ - 1724 约束最短路 暴搜 加剪枝

POJ 3411 Mondriaan's Dream 銆愮姸鍘婦p銆?By cellur925

lightoj 1049 - One Way Roads(dfs)