该题是个图论
使用邻接表存放图
使用DFS搜索解决;但尤其注意需要剪枝
#include<iostream>
#include<vector>
#include<cstring>
#include<math.h>
using namespace std;
int K, N, R;
struct Road {
int d, L, t;
};
//使用邻接表存放图
vector<vector<Road>> G(110); //一维vector代表的是城市、二维代表的是该城市的道路;由于每个城市的道路数量不确定,所以使用vector类
int minL[110][10010]; //minL[i][j]:起点走到城市i且此时花了j块钱的最小路径
int minLen;
int totalLen;
int totalCost;
int visited[110];
void dfs(int s) {
if (s == N) {
minLen = min(totalLen, minLen);
}
//DFS该城市的每一条道路
for (int i = 0; i < G[s].size(); i++) {
Road r = G[s][i]; //每个城市的道路
if (r.t + totalCost <= K && visited[r.d] == 0) {
if (totalLen + r.L >= minLen) //最优性剪枝
continue;
if (totalLen + r.L > minL[r.d][totalCost + r.t]) //记忆性剪枝
continue;
minL[r.d][totalCost + r.t] = totalLen + r.L; //更新记忆值
totalLen += r.L;
totalCost += r.t;
visited[r.d] == 1;
dfs(r.d);
visited[r.d] == 0;
totalLen -= r.L;
totalCost -= r.t;
}
}
}
int main() {
//输入数据
cin >> K >> N >> R;
Road r;
for (int i = 0; i < R; i++) {
int s;
cin >> s >> r.d >> r.L >> r.t;
if (s != r.d) {
G[s].push_back(r);
}
}
//数据初始化
memset(visited, 0, sizeof(visited));
for (int i = 0; i < 110; i++)
for (int j = 0; j < 10010; j++)
minL[i][j] = 10000;
minLen = 10000;
int totalLen = 0;
int totalCost = 0;
dfs(1);
if (minLen == 10000)
cout << -1;
else
cout << minLen;
}