题目链接: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. Windows Phone播放视频流

    前言 MediaElement是Windows Phone中播放本地或者网络视频文件和音乐文件的常用控件,支持的格式可以从这里看.通过Play,Pause,Stop,Position方法或属性可以方便 ...

  2. [转]webrtc学习: 部署stun和turn服务器

    [转]webrtc学习: 部署stun和turn服务器 http://www.cnblogs.com/lingdhox/p/4209659.html webrtc的P2P穿透部分是由libjingle ...

  3. Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域

    1.栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源 2.堆区(heapsegment)—一般由程序员分配释放 ...

  4. 转载 SQL Server 2008 R2 事务与隔离级别实例讲解

    原文:http://blog.itpub.net/13651903/viewspace-1082730/ 一.事务简介 SQL Server的6个隔离级别中有5个是用于隔离事务的,它们因而被称作事务隔 ...

  5. Github的使用以及Git的简单入门 - 课程作业三

    GitHub创建项目 登录GitHub,在个人主页创建项目(repository) 创建后会生成2个文件,README.md和.gitignore.如图 创建本地仓库 如果是第一次使用git的话,需要 ...

  6. Codeforces Round #350 (Div. 2) D2. Magic Powder - 2

    题目链接: http://codeforces.com/contest/670/problem/D2 题解: 二分答案. #include<iostream> #include<cs ...

  7. Spring与apache CXF结合实例

    本文的前提是已经有一个Spring的项目,在此基础上如何跟apache CXF进行结合,开发出WebService服务和调用WebService服务. 1.开发WebService   1.引入jar ...

  8. poj 2987 Firing 最大权闭合图

    题目链接:http://poj.org/problem?id=2987 You’ve finally got mad at “the world’s most stupid” employees of ...

  9. sencha Touch 2.4 学习之 XTemplate模板

    XTemplate模板 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  10. ASP.NET 4.5新特性WebAPI从入门到精通

    在新出的MVC4中,增加了WebAPI,用于提供REST风格的WebService,新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models.Views.Controllers等文件夹和 ...