深度优先搜索1-寻路问题(算法基础 第6周)

来源:互联网 发布:淘宝代运营怎么样 编辑:程序博客网 时间:2024/05/29 07:34

讲解
这里写图片描述
这里写图片描述
这里写图片描述
源码

#include <iostream>#include <vector>#include <cstring>using namespace std;int K,N,R,S,D,L,T;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        if (!visited[d]) {            int cost = totalCost + cityMap[s][i].t;            if (cost > K)                continue;            if (totalLen + cityMap[s][i].L >= minLen || 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;}
0 0
原创粉丝点击