POJ 1724 ROADS(费用最短路:优先队列+BFS)

12 篇文章 0 订阅
4 篇文章 0 订阅

这个做法是错误的!!!!数据太水,就水过去了。

要看正解请看另一个题目的解法

题目意思很简单,就是求费用最短路,数据比较小,考虑暴力bfs。

状态定义为(花费,最短路,终点)的一个三元组。

优先队列按照最短路长度排序,每次从队列里取出最短路长度最短的状态,然后把跟该状态终点相邻的点加入队列。因为数据比较小,所以不用记录访问情况也能ac。

#pragma warning(disable:4996)
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
vector<int>g[N], e[N], cost[N];

struct node {
	int cost, len, v;
	node(){}
	node(int cost,int len,int v):cost(cost),len(len),v(v){}
	bool operator<(const node&op)const {
		return len > op.len;
	}
};
int n, k;

void add(int u, int v, int c, int cc) {
	g[u].push_back(v);
	e[u].push_back(c);
	cost[u].push_back(cc);
}

int bfs() {
	priority_queue<node>q;
	q.push(node(0, 0, 1));
	while (!q.empty()) {
		node now = q.top(); q.pop();
		int u = now.v;
		if (u == n)return now.len;//如果是所求终点的话直接返回就是符合费用条件的最短路了
		for (int i = 0; i < (int)g[u].size(); i++) {
			int to = g[u][i];
			if (now.cost + cost[u][i] <= k) {//如果符合费用条件就加入队列
				q.push(node(now.cost + cost[u][i], now.len + e[u][i], to));
			}
		}
	}
	return -1;
}

int main() {
	int R;
	scanf("%d %d %d", &k, &n, &R);

	while (R--) {
		int a, b, c, d;
		scanf("%d %d %d %d", &a, &b, &c, &d);
		add(a, b, c, d);
		//add(b, a, c, d);
	}
	printf("%d\n", bfs());
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值