题目链接:http://poj.org/problem?id=1724

思路:

有限制的最短路,或者说是二维状态吧,在求最短路的时候记录一下花费即可。一开始用SPFA写的,900MS险过啊,然后改成Dijkstra+priority_queue,60MS,orz.

SPFA:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 104
#define inf 1<<30
typedef pair<int,int>Pair; struct Edge{
int v,w,c;
Edge(int vv,int ww,int cc):v(vv),w(ww),c(cc){}
}; vector<vector<Edge> >map;
int dist[MAXN][MAXN*MAXN];//在点i花费j的最短路径
bool mark[MAXN][MAXN*MAXN];
int k,n,m,MIN; bool SPFA()
{
memset(mark,false,sizeof(mark));
for(int i=;i<=n;i++)
for(int j=;j<=k+;j++)
dist[i][j]=inf;
queue<Pair>Q;
Q.push(make_pair(,));
dist[][]=;
mark[][]=true;
while(!Q.empty()){
Pair pp=Q.front();
Q.pop();
int u=pp.first,c=pp.second;
mark[u][c]=false;
for(int i=;i<map[u].size();i++){
int v=map[u][i].v;
int w=map[u][i].w;
int cc=map[u][i].c+c;
if(cc>k)continue;
if(dist[u][c]+w<dist[v][cc]){
dist[v][cc]=dist[u][c]+w;
if(!mark[v][cc]){
mark[v][cc]=true;
Q.push(make_pair(v,cc));
}
}
}
}
MIN=inf;
for(int i=;i<=k;i++)MIN=min(MIN,dist[n][i]);
return MIN<inf;
} int main()
{
int u,v,w,c;
while(~scanf("%d%d%d",&k,&n,&m)){
map.clear();map.resize(n+);
while(m--){
scanf("%d%d%d%d",&u,&v,&w,&c);
map[u].push_back(Edge(v,w,c));
}
if(SPFA()){
printf("%d\n",MIN);
}else
puts("-1");
}
return ;
}

Dijkstra+priority_queue:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 104
#define inf 1<<30
typedef pair<int,int>Pair; struct Edge{
int v,w,c;
Edge(int vv,int ww,int cc):v(vv),w(ww),c(cc){}
}; struct Node{
int u,dd,cost;
bool operator < (const Node &p) const {
if(p.dd==dd)return p.cost<cost;
return p.dd<dd;
}
}; vector<vector<Edge> >map;
int k,n,m,MIN; bool Dijkstra()
{
priority_queue<Node>Q;
Node p,q;
p.u=,p.dd=,p.cost=,MIN=inf;
Q.push(p);
while(!Q.empty()){
p=Q.top();
Q.pop();
int u=p.u,dd=p.dd,cost=p.cost;
if(u==n){ MIN=dd;break; }
for(int i=;i<map[u].size();i++){
int v=map[u][i].v,w=map[u][i].w,c=map[u][i].c;
if(cost+c<=k){
q.u=v;q.dd=dd+w;q.cost=cost+c;
Q.push(q);
}
}
}
return MIN<inf;
} int main()
{
int u,v,w,c;
while(~scanf("%d%d%d",&k,&n,&m)){
map.clear();map.resize(n+);
while(m--){
scanf("%d%d%d%d",&u,&v,&w,&c);
map[u].push_back(Edge(v,w,c));
}
if(Dijkstra()){
printf("%d\n",MIN);
}else
puts("-1");
}
return ;
}

poj 1724(有限制的最短路)的更多相关文章

  1. POJ 1724 (分层图最短路)

    ### POJ 1724 题目链接 ### 题目大意: 给你 N 个点 ,M 条有向路,走每条路需要花费 C 元,这段路的长度为 L . 给你 K 元,问你能否从 1 走到 N 点且花费不超过 K 元 ...

  2. POJ 1724 ROADS(bfs最短路)

    n个点m条边的有向图,每条边有距离跟花费两个参数,求1->n花费在K以内的最短路. 直接优先队列bfs暴力搞就行了,100*10000个状态而已.节点扩充的时候,dp[i][j]表示到达第i点花 ...

  3. POJ 1724 二维费用最短路

    题目大意:有N个城市,编号1-N有R条路,每条路(单向)的起点为Si,终点为Di,长度为Li,如果要走这条路需要花Ti的钱现在你只有K元钱,求在不超支的前提下,从1走到N需要的最短距离 这里总是希望路 ...

  4. 深搜+剪枝 POJ 1724 ROADS

    POJ 1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12766   Accepted: 4722 D ...

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

    http://poj.org/problem?id=1724 题意:最短路的模板,不过每条边加上一个费用,要求总费用不超过k 题解:不能用dijkstra ,直接暴力,dfs维护len和cost. 普 ...

  6. 【poj 1724】 ROADS 最短路(dijkstra+优先队列)

    ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12436 Accepted: 4591 Description N ...

  7. ROADS POJ - 1724(分层最短路)

    就是在最短路的基础上   多加了一个时间的限制 , 多一个限制多一维就好了  记住 分层最短路要用dijistra !!! #include <iostream> #include < ...

  8. poj 1724(最短路+优先队列)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13436   Accepted: 4921 Descriptio ...

  9. poj 1724 最短路+优先队列(两个约束条件)

    /*两个约束条件求最短路,用优先队列*/ #include<stdio.h> #include<string.h> #include<queue> using na ...

随机推荐

  1. bootstrap插件之Carousel

    兼容:ie9以上 特点:滑动图片看起来永远只有两帧,过度完美:是html css js的完美配合:其中html的data属性起了关键性作用 前提:normalize.css  jquery.js ht ...

  2. 别跟我来这套 Hot Swap 热插拔

    如果你觉得我们演的不好,可以随时打断,如果你觉得怎么演好可以随时来改,你都可以直接来演.

  3. iOS学习之UIView

    一.UI编程概述      1.UI的本意是用户界面,是英文User和Interface的缩写.      2.UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计.      3.软件设计可 ...

  4. nodejs使用mongoose

    var mongoose = require("mongoose"); // 连接字符串格式为mongodb://主机/数据库名 mongoose.connect('mongodb ...

  5. Objective-C 内存管理原则

    内存管理方针 用于内存管理的基本模型采用引用计数的环境之中提供的组合方法中定义在NSObject协议和标准方法的命名约定.NSObject类也定义了一个方法:dealloc,当调用一个对象时自动回收, ...

  6. 【译】理解与分析ios应用的崩溃报告

    源网址: http://developer.apple.com/library/ios/#technotes/tn2151/_index.html 当一个应用程序崩溃时,创建一份“崩溃报告”对于理解崩 ...

  7. swift 命令行工具初探

    亲爱的同学们好,今天我们要介绍这么一个东西.相信有过解释型语言(PHP,Ruby,等)使用经验的同学会更加熟悉,就是 Swift 也为我们提供了命令行运行工具,俗称 REPL.好了,我们进入正题,在安 ...

  8. OC学习笔记之属性详解和易错点

    属性的概念在OC1.0中就存在,格式是定义实例变量,然后定义setter和getter方法,用点操作符操作属性 举例,类的接口部分 @interface Father : NSObject { NSI ...

  9. HDU 5638 拓扑排序+优先队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...

  10. 【BZOJ】【3282】Tree

    LCT 喜闻乐见的Link-Cut-Tree…… srO zyf http://www.cnblogs.com/zyfzyf/p/4149109.html 目测我是第222个?………………不要在意这些 ...