题目连接:http://poj.org/problem?id=1724
题目大意:
找出一条从1到N得最短的一条路并且费用不超过给出的最大费用。
思路:
很容易会想到dfs,但是需要剪枝,首先存储数据要采用邻接表的方式存储,因为这样就避免了去匹配点的过程,其次搜到当前位置比之前记下的最短路长的话,就不用再往下搜了,还要注意控制费用的限制
代码:
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxc = 105;
const int maxr = 10010;
const int inf = 0x3f3f3f3f;
struct Road
{
int from;
int to;
int len;
int cost;
int next;
}road[maxr];
int mint ;
int vis[maxc];
int headlist[maxc];
int k, n, r;
void dfs(int pos, int resmoney, int length)
{
if(length > mint)
return;
if(length < mint && pos == n && resmoney >= 0)
{
mint = length;
return;
}
for(int i = headlist[pos]; i!= -1; i = road[i].next)
{
if(!vis[road[i].to] && resmoney >= road[i]. cost)
{
vis[road[i].to] = 1;
dfs(road[i].to, resmoney - road[i].cost, length + road[i].len);
vis[road[i].to] = 0;
}
}
}
int main()
{
while(scanf("%d%d%d", &k, &n, &r)!=EOF)
{
memset(vis, 0, sizeof(vis));
memset(headlist, -1, sizeof(headlist));
for(int i = 0; i < r; i++)
{
cin>>road[i].from>>road[i].to>>road[i].len>>road[i].cost;
road[i].next = headlist[road[i].from];
headlist[road[i].from] = i;
}
mint = inf;
dfs(1, k, 0);
if(mint == inf)
cout<<"-1"<<endl;
else
cout<<mint<<endl;
}
return 0;
}
</span>