POJ 1724 ROADS 最短路

题目大意:有两个权值的最短路问题,要求满足费用不超过一定限度的情况下的最短路。

思路:正常的SPFA加一个小判断,就是当费用高于预期费用的时候不入队,顺便加一个pq吧。

CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100005
#define INF 0x3f3f3f3f
using namespace std;

int money,points,edges;
int head[MAX],total;
int next[MAX],aim[MAX],length[MAX],cost[MAX];

struct Complex{
	int pos,len,c;

	Complex(int _,int __,int ___):pos(_),len(__),c(___) {}
	bool operator <(const Complex &a)const {
		return len > a.len;
	}
};

inline void Add(int x,int y,int len,int c)
{
	next[++total] = head[x];
	aim[total] = y;
	length[total] = len;
	cost[total] = c;
	head[x] = total;
}

int HeapSPFA()
{
	static priority_queue<Complex> q;
	q.push(Complex(1,0,0));
	while(!q.empty()) {
		Complex now = q.top(); q.pop();
		int x = now.pos,len = now.len,c = now.c;
		if(x == points)	return len;
		for(int i = head[x]; i; i = next[i])
			if(c + cost[i] <= money)
				q.push(Complex(aim[i],len + length[i],c + cost[i]));
	}
	return -1;
}

int main()
{
	cin >> money >> points >> edges;
	for(int x,y,z,l,i = 1; i <= edges; ++i) {
		scanf("%d%d%d%d",&x,&y,&z,&l);
		Add(x,y,z,l);
	}
	cout << HeapSPFA() << endl;
	return 0;
}

时间: 2024-10-07 07:36:29

POJ 1724 ROADS 最短路的相关文章

POJ 1724 ROADS

点击打开链接 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10202   Accepted: 3786 Description N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and t

深搜+剪枝 POJ 1724 ROADS

POJ 1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12766   Accepted: 4722 Description N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and

poj 1724 ROADS (bfs+优先队列)

题目链接 题意:在有费用k限制的条件下,求从1到n的最短距离,如果最短距离相同求费用最小的,边为有向边,其中可能有 多个相同的源点和目标点,但是距离和费用不同. 分析:用bfs和邻接表来把每一个边搜一下,因为用了优先队列,所以先到n的一定是最小的 . 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio&

poj 1724 ROADS 解题报告

题目链接:http://poj.org/problem?id=1724 题目意思:给出一个含有N个点(编号从1~N).R条边的有向图.Bob 有 K 那么多的金钱,需要找一条从顶点1到顶点N的路径(每条边需要一定的花费),前提是这个总花费  <= K. 首先这里很感谢 yunyouxi0 ,也就是我们的ACM队长啦~~~,他一下子指出了我的错误——存储重边的错误.这条题卑鄙的地方是,有重边,discuss 中的数据过了也不一定会AC啦.大家不妨试试这组数据(队长深情奉献^_^) 2 2 2 1

poj 1724 ROADS(dfs)

http://poj.org/problem?id=1724 大致题意:N个城市由R条单向路连通,每条路(S,D)之间有两个因素:路的长度L和路的花费T.现要从城市1到达城市N,求花费在K以内的最短路程. 思路:很明显的dfs(他们都说很明显的spfa...).不过dfs有几点注意的地方: 建立邻接表不能用vector存,要用链表的形式,采用头插法. dfs的时候,在递归节点v之前,要先预判断一下到达v之后总花费是否大于k,若大于K就跳过,不必再调用v节点,这样会省很多时间.对于路程的处理也同样

poj 1724:ROADS(DFS + 剪枝)

ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Description N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll

ROADS POJ - 1724 约束最短路 暴搜 加剪枝

http://poj.org/problem?id=1724 题意:最短路的模板,不过每条边加上一个费用,要求总费用不超过k 题解:不能用dijkstra ,直接暴力,dfs维护len和cost. 普通的剪枝:如果当前的cost大于k直接跳出,如果当前的len大于minlen(目前的最优解),跳出. 另一个剪枝:维护花费一定费用 到达某个点 的最短路minL[v][cost],如果当前的len大于L,则跳出. ac代码: #define _CRT_SECURE_NO_WARNINGS #incl

POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)

题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for the road (expressed in the num

POJ 2449Remmarguts&#39; Date K短路模板 A*+SPFA

太水了我不想说了,模板在这里 14312K 313MS 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int v[100010],v2[100010],c[100010],c2[100010],s,t,k,duin; 7 int n,m,point[1010],next[100010],cnt=0,