poj3411(dfs)

链接:点击打开链接

题意:有n座城市,m条路,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱。问从城市1到城市n最少要花多少钱

代码:

#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
struct node{
    int b,c,p,r;
};
vector<node> s[20];
int n,m,ans;
int vis[20];
void dfs(int u,int sum){
//    cout<<u<<" "<<sum<<endl;
    int i;
    vis[u]++;                                   //标记经过的路径
//    cout<<vis[1]<<endl;
    if(sum>ans)
    return;
    if(u==n){
        ans=min(ans,sum);
        return;
    }
    for(i=0;i<s[u].size();i++){
        if(vis[s[u][i].b]<10){                  //我认为应该小于10,而不是网上所说的3
        if(vis[s[u][i].c]&&s[u][i].p<s[u][i].r) //可以试下下面的数据
        dfs(s[u][i].b,sum+s[u][i].p);
        else
        dfs(s[u][i].b,sum+s[u][i].r);
        vis[s[u][i].b]--;
        }
    }
}
int main(){
    int i,j,a;
    node tmp;
    while(scanf("%d%d",&n,&m)!=EOF){
        ans=INF;
        for(i=0;i<=n;i++)
        s[i].clear();
        memset(vis,0,sizeof(vis));
        for(i=0;i<m;i++){
        scanf("%d",&a);
        scanf("%d%d%d%d",&tmp.b,&tmp.c,&tmp.p,&tmp.r);
        s[a].push_back(tmp);
        }                       
        dfs(1,0);
        if(ans==INF)
        puts("impossible");
        else
        printf("%d\n",ans);
    }
    return 0;
}
/*
10 18
1 10 9 0 100
10 1 10 0 100
1 9 8 0 100
9 1 9 0 100
1 8 7 0 100
8 1 8 0 100
1 7 6 0 100
7 1 7 0 100
1 6 5 0 100
6 1 6 0 100
1 5 4 0 100
5 1 5 0 100
1 4 3 0 100
4 1 4 0 100
1 3 2 0 100
3 1 3 0 100
1 2 1 0 100
2 1 2 0 100
*/

 

    原文作者:DFS
    原文地址: https://blog.csdn.net/stay_accept/article/details/50609303
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞