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
",ans);
    }return 0;
}
原文地址:https://www.cnblogs.com/forever97/p/poj3411.html