pku 1724 ROADS BFS +优先队列

news/2024/7/5 5:38:27

http://poj.org/problem?id=1724

题意:

Bob现在有的钱数为k,他想从城市1到城市n,给出m条连接两个城市的有向边,并且给出路的长度w,和经过这条路要交的钱数c。问Bob在花的过路费不超过k的前提下能到达城市n的最短路径为多长。

思路:

才开始我想spfa来做,开两个数组dis记录距离最短disw记录话费最小,在松弛的时候进行距离与费用的限制来进行,可是发现当某一个点被多个点更新时,比如i点被更新为[7,12] [9,9] [12,7]

 那我们选择哪一个呢?如果我们选择路径短的话,[7,12] 可是可能时间总和就会超出k,如果我们选择费用小的话[12,7] 可是路径的长度可能不如选择[9,9]的短,所以无法做出选择。

这里我们用bfs来做,队列用优先队列实现,这里有了两个保证:1:bfs本身搜索的过程就是找最值得过程,我们用它来实现费用最小;2:优先队列每次出来的是路径最小的那么我们又得到了路径最小的满足。一举两得啊!!

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define maxn 107
using namespace std;

const int inf = 0x7fffffff;

struct node
{
    int v;
    int l,w;
    node *next;
}H[maxn*maxn],*head[maxn];

//搜索过程中的记录
struct nn
{
    int cost;
    int len;
    int pos;
    friend bool operator < (nn a, nn b)
    {
        return a.len > b.len;
    }
};

int n,m,k,t,ans;
priority_queue<nn>que;


void insert(int u,int v,int l,int w)
{
    node *q = &H[t++];
    q->v = v;
    q->l = l;
    q->w = w;
    q->next = head[u];
    head[u] = q;
}

void bfs(int s)
{
    nn p;
    p.cost = 0;
    p.len = 0;
    p.pos = s;
    que.push(p);
    while (!que.empty())
    {
        nn u = que.top(); que.pop();
        if (u.pos == n)
        {
            ans = u.len;
            break;
        }
        node *q;
        for (q = head[u.pos]; q ; q = q->next)
        {
            nn tp;
            tp.pos = q->v;
            if (u.cost + q->w <= k)
            {
                tp.cost = u.cost + q->w;
                tp.len = u.len + q->l;
                que.push(tp);
            }
        }
    }

}
int main()
{
   //freopen("d.txt","r",stdin);
   int i,a,b,l,w;
   t = 0; ans = inf;
   scanf("%d%d%d",&k,&n,&m);
   for (i = 0; i < m; ++i)
   {
       scanf("%d%d%d%d",&a,&b,&l,&w);
       insert(a,b,l,w);
   }
   bfs(1);
   if (ans != inf) printf("%d\n",ans);
   else printf("-1\n");
   return 0;
}

 

 

转载于:https://www.cnblogs.com/E-star/archive/2012/08/10/2633118.html


http://www.niftyadmin.cn/n/3501643.html

相关文章

5320 软件集合

用户名&#xff1a;fkedwgwy密码:fkedwgwy 《爱她就要学会用她》 目前软件&#xff1a; UC6.0 QQ2008 来电通 天气通 掌上书院 【090609】【5320 软件集合】超强音乐 播放器 MobiFactor PowerMp3 v1.17 完全版 【090609】【5320 软件集合】火烧图文Burn1.2汉化版 【090610】…

centos7 中ifconfig提示-bash

1、检查是否存在ifconfig命令&#xff1a;cat /sbin/ifconfig2、不存在&#xff0c;安装net-toolsyum upgradeyum install net-tools转载于:https://blog.51cto.com/wd0809/1852722

linux重定向文件过大,关于linux:如何将输出重定向到文件和标准输出

在bash中&#xff0c;调用foo将在stdout上显示该命令的任何输出。调用foo > output会将该命令的任何输出重定向到指定的文件(在本例中为"output")。有没有方法将输出重定向到一个文件&#xff0c;并在stdout上显示它&#xff1f;如果有人在这里寻找错误输出到文件…

运维实践

一、批量杀死进程ps -ef |grep mysql | awk {print $2} |head -1|xargs kill -9二、Windows下GBK编码转换UTF8iconv -f GBK -t UTF8 addreezd.csv -o addreezd2.csv三、当Tomcat异常宕机后重启服务#!/bin/bash Tomcatstart"/usr/install/tomcat8/bin/startu…

博客园开博纪念.

先来段八股虚伪一下&#xff1a;在博客园领导的热情关怀和支持下&#xff0c;广大博客园人民群众的鼓励下&#xff0c;本人为了为党和国家多做好事、实事发挥余热&#xff0c;在计 算机软件技术领域的先锋组织《博客园》安营扎寨&#xff0c;甘愿做铺路石&#xff0c;为博客园…

TCP/IP的6个标志位

最近在优化web服务器上的iptables时需要用到tcp模块下的--tcp-flags和limit模块&#xff0c;在网上看到一篇对tcp的标志位总结的很好的文章&#xff0c;在这里收录下&#xff0c;以下来自http://blog.163.com/sea_haitao/blog/static/7756216201262011054462/三次握手&#xff…

Linux数据库服务器

Linux数据库服务器 一、mysql数据库的安装 确保安装gcc&#xff08;开发工具&#xff09; #groupadd mysql #useradd -g mysql mysql #cd /usr/local # tar -zxvf mysql-5.0.37-linux-i686-glibc23.tar.gz # ln -s mysql-5.0.37-linux-i686-glibc23 mysql //创建别名 #cd mysql…

linux 杀毒软件开源,Clamav-GNU开源杀毒软件简介

一、简介Clam AntiVirus是基于UNIX/LINUX操作系统的一款免费杀毒软件&#xff0c;它支持在线更新病毒库1.1 特点GNU开源软件快速扫描可以检测35000种病毒&#xff0c;蠕早&#xff0c;特洛依&#xff0c;包括Microsoft Office文档及宏病毒能够检测压缩文件(Zip RAR Tar Gzip Bz…