#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 + 剪枝
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- http://poj.org/problem?id=1321 题意是给你一个n * n的矩阵,上面有若干块是可以放...
- 题目链接 题意:要从1到N的最短路并且每一条路上有对应的花费要求,总花费不能大于给定的一个值K,输出最短路径的长度...
- 一说起乔妹谭乔尹你会想到什么?是环球小姐中国区第四名?是国际超模?还是中大校花? 这位才貌兼备的美女,就...