首页 > 代码库 > poj 1724 ROADS (bfs+优先队列)
poj 1724 ROADS (bfs+优先队列)
题目链接
题意:在有费用k限制的条件下,求从1到n的最短距离,如果最短距离相同求费用最小的,边为有向边,其中可能有
多个相同的源点和目标点,但是距离和费用不同。
分析:用bfs和邻接表来把每一个边搜一下,因为用了优先队列,所以先到n的一定是最小的 。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <queue> 7 #include <algorithm> 8 #define LL long long 9 const int maxn = 100+50;10 using namespace std;11 int k, n, r;12 struct node13 {14 int v, l, w;15 bool operator < (const node &temp)const16 {17 if(l == temp.l)18 return w > temp.w; //长度相同按费用排序19 return l > temp.l;20 }21 } ne, pos;22 vector<node>e[maxn];23 24 void bfs() //里面不能加vis[]数组,因为一个点可能走多次25 {26 int i;27 priority_queue<node>q;28 ne.v = 1;29 ne.l = 0;30 ne.w = 0;31 q.push(ne);32 while(!q.empty())33 {34 pos = q.top();35 q.pop();36 if(pos.v == n)37 {38 printf("%d\n", pos.l);39 return;40 }41 for(i = 0; i < e[pos.v].size(); i++)42 {43 ne.v = e[pos.v][i].v;44 ne.l = pos.l + e[pos.v][i].l;45 ne.w = pos.w + e[pos.v][i].w;46 if(ne.w <= k)47 q.push(ne);48 }49 }50 printf("-1\n");51 }52 int main()53 {54 int i, j;55 while(~scanf("%d", &k))56 {57 scanf("%d%d", &n, &r);58 for(i = 0; i <= n; i++)59 e[i].clear();60 for(i = 0; i < r; i++)61 {62 scanf("%d%d%d%d", &j, &ne.v, &ne.l, &ne.w);63 e[j].push_back(ne); //跟j相连的加入64 }65 bfs();66 }67 return 0;68 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。