Description
Input
Output
Sample Input
5 6 7 1 2 2 3 2 4 3 3 3 4 2 4 1 3 4 1 4 6 2 1 3 5 2 0 5 4 3 2
Sample Output
11题目大意:给出一个有向图,边上有两个权值,分别是距离和花费。求一条从1到N的最短路,使得总花费小于等于k。
解题思路:这道题是出现在最短路的练习里,结果用BFS + 优先队列水过了。node里面保存的是当前节点的标号,所走过的距离以及已经花费的钱数。初始时(1,0,0)入队,表示在1号点,走了0距离,总花费为0。然后根据给出的图BFS即可,注意条件判断。
代码如下:
#include
#include
#include
#include
#include
#include
#define MEM(arr,val) memset(arr,val,sizeof(arr))
const int maxm = 10005;//roads
const int maxn = 105;//cities
using namespace std;
struct road
{
int to;
int dis;
int cost;
road(int to,int dis,int cost)
{
this -> to = to;
this -> dis = dis;
this -> cost = cost;
}
};
struct node
{
int id;
int dis;
int used;
node(int id,int dis,int used)
{
this -> id = id;
this -> dis = dis;
this -> used = used;
}
bool operator < (const node& a)const
{
return a.dis == dis ? a.used > used : dis > a.dis;
}
};
int k,n,r,d[maxn];
vector G[maxn];
priority_queue que;
void init()
{
for(int i = 0;i < maxn;i++)
G[i].clear();
}
void add_edge(int from,int to,int dis,int cost)
{
G[from].push_back(road(to,dis,cost));
}
int bfs()
{
while(que.size())
que.pop();
que.push(node(1,0,0));
while(que.size()){
node p = que.top();
que.pop();
if(p.id == n)
return p.dis;
for(int i = 0;i < (int)G[p.id].size();i++){
road rd = G[p.id][i];
if(k - p.used < rd.cost)
continue;
que.push(node(rd.to,rd.dis + p.dis,p.used + rd.cost));
}
}
return -1;
}
int main()
{
init();
scanf("%d %d %d",&k,&n,&r);
int from,to,dis,cost;
while(r--){
scanf("%d %d %d %d",&from,&to,&dis,&cost);
add_edge(from,to,dis,cost);
}
printf("%d\n",bfs());
return 0;
}