• poj 3411 Paid Roads (dfs)


    题目链接

    题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的。

    每条路是要花费的。每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c城市,那么这条

    路上的花费为P也可以为R。2:如果没有经过c,则这条路上的花费为R。问从城市1到城市n最小的花费是多少.

    思路:存在走多次边的情况,所以vis[]数组可以多次,但是这个题目的多次的上限为3(不知道为什么)。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <algorithm>
     8 #define LL long long
     9 using namespace std;
    10 const int maxn = 20+10;
    11 const int INF = 1<<28;
    12 int n, m, vis[maxn], ans;
    13 struct node
    14 {
    15     int b, c, p, r;
    16 }tmp;
    17 vector<node>v[maxn];
    18 
    19 void dfs(int x, int cost)
    20 {
    21     vis[x] ++;
    22     if(cost >= ans) return;
    23     if(x == n)
    24     {
    25         ans = cost;
    26         return;
    27     }
    28     int t, b1;
    29     for(int i = 0; i < v[x].size(); i++)
    30     {
    31         b1 = v[x][i].b;
    32         if(vis[b1]<=3)
    33         {
    34             t = INF;
    35             if(vis[v[x][i].c])
    36             t = v[x][i].p;
    37             if(t > v[x][i].r)
    38             t = v[x][i].r;
    39             dfs(b1, cost+t);
    40             vis[b1] --;
    41         }
    42     }
    43 }
    44 int main()
    45 {
    46     int i;
    47     int a1, b1, c1, p1, r1;
    48     while(~scanf("%d%d", &n, &m))
    49     {
    50         ans = INF;
    51         memset(vis, 0, sizeof(vis));
    52         for(i = 0; i < m; i++)
    53         {
    54           cin>>a1>>b1>>c1>>p1>>r1;
    55           tmp.b = b1; tmp.c = c1;
    56           tmp.p = p1; tmp.r = r1;
    57           v[a1].push_back(tmp);
    58         }
    59         dfs(1, 0);
    60         if(ans == INF) cout<<"impossible"<<endl;
    61         else cout<<ans<<endl;
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    swift学习二:基本的语法
    Unity3D游戏开发之开发游戏带来的问题
    Linux makefile 教程 很具体,且易懂
    匈牙利算法
    ExtJs自学教程(1):一切从API開始
    rman
    微软历史最高市值是多少?
    安装Oracle JDK 7.0与8.0 for Mac OS X后Eclipse启动报错的解决之道
    linux-sfdisk 使用方法
    未将对象引用设置到对象的实例--可能出现的问题总结
  • 原文地址:https://www.cnblogs.com/bfshm/p/3868877.html
Copyright © 2020-2023  润新知