最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20948    Accepted Submission(s): 6231

Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
 
Sample Output
9 11
 
题解:我是用的SPFA,在路径相等的情况下比较一下花费就OK。(dis[v]>dis[u]+d||(dis[v]==dis[u]+d)&&(cost[v]>cost[u]+p))
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
const int N = ;
const int M =;
const int INF =;
struct Edge{
int v,d,p,next;
}edge[*M];
int head[N];
int n,m;
void addedge(int u,int v,int d,int p,int &k){
edge[k].v =v,edge[k].d =d,edge[k].p=p,edge[k].next=head[u],head[u]=k++;
}
int dis[N],time[N],cost[N];
bool vis[N];
bool spfa(int s){
queue<int >q;
memset(vis,false,sizeof(vis));
memset(time,,sizeof(time));
for(int i=;i<=n;i++){
dis[i] = (i==s)?:INF;
cost[i] = (i==s)?:INF;
}
q.push(s);
time[s]++;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u]=false;
for(int k = head[u];k!=-;k=edge[k].next){
int v = edge[k].v,d= edge[k].d,p = edge[k].p;
if(dis[v]>dis[u]+d||(dis[v]==dis[u]+d)&&(cost[v]>cost[u]+p)){
dis[v]=dis[u]+d;
cost[v]=cost[u]+p;
if(!vis[v]){
vis[v] = true;
time[v]++;
q.push(v);
}
if(time[v]>n) return false;
}
}
}
return true;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF,n+m){
memset(head,-,sizeof(head));
int tot = ,u,v,d,p;
for(int i=;i<m;i++){
scanf("%d%d%d%d",&u,&v,&d,&p);
addedge(u,v,d,p,tot);
addedge(v,u,d,p,tot);
}
int s,t;
scanf("%d%d",&s,&t);
spfa(s);
printf("%d %d\n",dis[t],cost[t]);
}
return ;
}
 

hdu 3790(SPFA)的更多相关文章

  1. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  2. HDU - 3790 最短路径问题 (dijkstra算法)

    HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...

  3. HDU 3790 最短路径问题(SPFA || Dijkstra )

    题目链接 题意 : 中文题不详述. 思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次. #include < ...

  4. HDU 3790 最短路径问题 (SPFA)

    转载请注明出处:http://blog.csdn.net/a1dark 分析:比一般最短路多了一个花费.多加一个判断即可.用的SPFA.这道题让我搞清楚了以前定义INF为啥爆的问题.受益颇多. #in ...

  5. hdu 3790 最短路问题 (spfa练手)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  6. HDU 3790 最短路径问题 (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...

  7. HDU(3790),最短路二级标准

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    ...

  8. hdu 3790 最短路径问题(两个限制条件的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...

  9. hdu 3790 (最短路径问题dijkstra)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...

随机推荐

  1. Java代码中获取配置文件(config.properties)中内容的两种方法

    方法千千万,本人暂时只总结了两种方法. (1)config.properties中的内容如图 在applicationContext.xml中配置 <!-- 引入配置文件 --> < ...

  2. 《Java程序员由笨鸟到菜鸟》

    <Java程序员由笨鸟到菜鸟> 在众多朋友的支持和鼓励下,<Java程序员由菜鸟到笨鸟>电子版终于和大家见面了.本电子书涵盖了从java基础到javaweb开放框架的大部分内容 ...

  3. IIS Express mime type 列表。

    C:\Users\Administrator\Documents\IISExpress\config\applicationhost.config -------------------------- ...

  4. mysql一机多实例安装记录

    因为想研究mycat,所以需要安装多个mysql实例进行研究.限于没有多于计算机,只能在本机安装了.通过mysql文档,自己琢磨着安装成功! 目录结构如下: 其中one和two文件夹用来模拟数据库分库 ...

  5. CandyCrush 糖果传奇

    1.unity自带触发事件 unity的每一个Collider对象都有类似OnMouseDown.OnMouseOver等事件.此事件是存在于MonoBehaviour脚本里的,而MonoBehavi ...

  6. NGUI-Tweens

    Tweens(补间动画) 补间动画有很多种: 这里以Tween Height为例: 项目层次: btn为一个按钮,group为一组图片精灵,预览图如下: 第一步:先为每个item附加一个Tween H ...

  7. Android Service完全解析

    Service的基本用法 1.新建一个Android项目,新建一个MyService继承自Service,并重写父类的onCreate(),onStartCommand()方法和onDestory() ...

  8. ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 P: 【数组】1234方阵(phalanx)

    http://acm.ocrosoft.com/problem.php?cid=1316&pid=15 题目描述 编程打印如下规律的n*n方阵.输入n,按规律输出方阵. 方阵规律如下图:使左对 ...

  9. linux常见的编码转换

    1.如何界定是utf-8编码还是其他如 ANSI 或者gb2312编码 以“浙”这个汉字为例,用16进制编码查看时,显示 D5 E3 为2个字节,则为 ansi或者gb2312编码 "苏&q ...

  10. python os操作

    大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...