美文网首页
poj 1724 dfs + 剪枝

poj 1724 dfs + 剪枝

作者: 猴式智减法 | 来源:发表于2018-02-06 19:24 被阅读0次
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

int K, R, N;

struct Road {
    int d, L, t;
}; 

vector< vector < Road> > cityMap(110); //邻接表。citymap【i】 是从点i有路连到城市的集合 

int minLen = 1 << 30;  //当前找到的最优路径的集合 
int totalLen;   //正在走的路径的长度 
int totalCost;  //正在走的路径的花费 
int visited[110];  //标记城市是否走过 
int minL[110][10100];   //minL[i][j]表示从1到i点,花销为j的最短路的长度 

void dfs(int s) {      //从s向N走 
    if ( s == N) {
        minLen = min(minLen, totalLen);
        return;
    }
    for( int i = 0; i < cityMap[s].size(); i++) {
        int d = cityMap[s][i].d;                   //s有路连到d 
        int cost = totalCost + cityMap[s][i].t;
        if ( cost > K )
            continue;
        if ( !visited[d] ) {
            if (totalLen + cityMap[s][i].L >= minLen)
                continue;
            if (totalLen + cityMap[s][i].L >= minL[d][cost])
                continue;
                totalLen += cityMap[s][i].L;
                totalCost += cityMap[s][i].t;
                minL[d][cost] = totalLen;
                visited[d] = 1;
                dfs(d);
                visited[d] = 0;
                totalCost -= cityMap[s][i].t;
                totalLen -= cityMap[s][i].L;
        }
    }
}

int main() {
    
    cin  >> K >> N >> R;
    for ( int i = 0; i < R; i++) {
        int s;
        Road r;
        cin >> s >> r.d >> r.L >> r.t;
        if ( s != r.d )
            cityMap[s].push_back(r);
    }
    for (int i = 0; i < 110; i++)
        for (int j = 0; j < 10100; j++) {
            minL[i][j] = 1 << 30;
        }
    memset(visited, 0, sizeof(visited));
    totalLen = 0;
    totalCost = 0;
    visited[1] = 1;
    minLen = 1 << 30;
    dfs(1);
    if (minLen < (1 << 30))
        cout << minLen << endl;
    else
        cout << "-1" << endl;
    return 0;
}

相关文章

  • poj 1724 dfs + 剪枝

  • 穷竭搜索

    DFS POJ 1979: Red and Black简单的DFS找四联通块即可。代码如下 POJ 3009: C...

  • 1190 生日蛋糕 NI

    dfs+剪枝

  • 智慧搜索

    剪枝 POJ 1011: Sticks蓝书上的例题,不再赘述。代码如下 POJ 2046: Gap规则好复杂,看不...

  • 11.1

    复习了简单搜索,BFS 和 DFS,有些生疏了[POJ - 3278 ] (https://vjudge.net...

  • AcWing 165. 小猫爬山(搜索)

    深度优先搜索(dfs) 体会 要考虑的问题 枚举对象 dfs的参数 返回条件 剪枝技巧原题链接 枚举对象: 车...

  • 图论小结

    图的存储 邻接矩阵 邻接表 图的遍历 DFS(双向DFS) BFS(剪枝) 单源最短路径算法 dij 条件:无负权...

  • DFS+记忆化搜索

    dfs 和 bsf 和 回溯回溯是有剪枝的dfshttp://blog.csdn.net/fightforyour...

  • 暴力搜索 | DFS 回溯剪枝

    「算法笔记」「上机指南」买来一个多月了。还是在自己胡乱coding,今天本打算看一下我并不熟的最小堆emmmmmm...

  • 算法

    算法应用BFS广度优先搜索DFS深度优先搜索回溯法(DFS+剪枝)部分和问题分治法快速排序、归并排序动态规划背包问...

网友评论

      本文标题:poj 1724 dfs + 剪枝

      本文链接:https://www.haomeiwen.com/subject/xaagzxtx.html