题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

简单的最短路问题,这题听说有重边。我用spfa和dijkstra写了一遍,没判重边,速度都差不多。

dijkstra+优先队列:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int INF = 1e9 + ;
struct Node {
int _node , _dis , _cost;
bool operator <(const Node &cmp) const {
if(_dis == cmp._dis)
return _cost > cmp._cost;
return _dis > cmp._dis;
}
};
struct Edge {
int to , _dis , _cost , next;
}edge[int(2e5 + )];
int dis[] , cost[] , head[] , cnt; inline void add(int u , int v , int _dis , int _cost) {
edge[cnt].next = head[u];
edge[cnt].to = v;
edge[cnt]._cost = _cost;
edge[cnt]._dis = _dis;
head[u] = cnt++;
} void dijkstra(int s) {
dis[s] = cost[s] = ;
priority_queue <Node> que;
while(!que.empty()) {
que.pop();
}
que.push(Node{s , , });
while(!que.empty()) {
Node temp = que.top();
que.pop();
int u = temp._node;
if(temp._dis > dis[u])
continue;
for(int i = head[u] ; ~i ; i = edge[i].next) {
int v = edge[i].to;
if(dis[v] > dis[u] + edge[i]._dis) {
dis[v] = dis[u] + edge[i]._dis;
cost[v] = cost[u] + edge[i]._cost;
que.push(Node{v , dis[v] , cost[v]});
}
else if(dis[v] == dis[u] + edge[i]._dis && cost[v] > cost[u] + edge[i]._cost) {
cost[v] = cost[u] + edge[i]._cost;
que.push(Node{v , dis[v] , cost[v]});
}
}
}
} int main()
{
int n , m , u , v , d , c;
while(~scanf("%d %d" , &n , &m) && (n || m)) {
for(int i = ; i <= n ; ++i)
cost[i] = dis[i] = INF;
memset(head , - , sizeof(head));
cnt = ;
while(m--) {
scanf("%d %d %d %d" , &u , &v , &d , &c);
add(u , v , d , c);
add(v , u , d , c);
}
scanf("%d %d" , &u , &v);
dijkstra(u);
printf("%d %d\n" , dis[v] , cost[v]);
}
return ;
}

spfa:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1e9 + ;
typedef pair <int , pair<int , int> > P; //邻接点 长度 花费
int dis[] , cost[];
vector <P> G[];
void spfa(int s) {
dis[s] = cost[s] = ;
queue <int> que;
while(!que.empty()) {
que.pop();
}
que.push(s);
while(!que.empty()) {
int node = que.front();
que.pop();
for(int i = ; i < G[node].size() ; ++i) {
int temp = G[node][i].first;
if(dis[temp] > dis[node] + G[node][i].second.first) {
dis[temp] = dis[node] + G[node][i].second.first;
cost[temp] = cost[node] + G[node][i].second.second;
que.push(temp);
}
else if(dis[temp] == dis[node] + G[node][i].second.first && cost[temp] > cost[node] + G[node][i].second.second) {
cost[temp] = cost[node] + G[node][i].second.second;
que.push(temp);
}
}
}
} int main()
{
int n , m , u , v , d , c;
while(~scanf("%d %d" , &n , &m) && (n || m)) {
for(int i = ; i <= n ; ++i) {
dis[i] = cost[i] = INF;
G[i].clear();
for(int j = i + ; j <= n ; ++j)
to[i][j] = to[j][i] = INF;
}
for(int i = ; i < m ; ++i) {
scanf("%d %d %d %d" , &u , &v , &d , &c);
G[u].push_back(P(v , make_pair(d , c)));
G[v].push_back(P(u , make_pair(d , c)));
}
scanf("%d %d" , &u , &v);
spfa(u);
printf("%d %d\n" , dis[v] , cost[v]);
}
return ;
}

HDU 3790 最短路径问题 (最短路)的更多相关文章

  1. HDU 3790最短路径问题 [最短路最小花费]

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

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

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

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

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

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

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

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

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

  6. hdu 3790 最短路径问题(最短路,Dijsktra)

    题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...

  7. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  8. hdu 3790 最短路径问题(迪杰斯特拉)

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

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

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

随机推荐

  1. JS中令人发指的valueOf方法介绍

    彭老湿近期月报里提到了valueOf方法,兴致来了翻了下ECMA5里关于valueOf方法的介绍,如下: 15.2.4.4 Object.prototype.valueOf ( ) When the ...

  2. bzoj2489

    这种题完全可以暴力找规律,暴力打表各种搞法 这里有一篇比较全面的题解:http://acm.uestc.edu.cn/bbs/read.php?tid=3698&page=1&tore ...

  3. QSettings介绍

    简介 QSettings类提供了持久的跨平台应用程序设置. 用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表,OS X和iOS的属性列表文件中. ...

  4. ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking

    #!/bin/bash # # ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking # 说明: # 本文主 ...

  5. RTP封装h264

    网络抽象层单元类型 (NALU): NALU头由一个字节组成,它的语法如下: +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+ ...

  6. ZOJ1260/POJ1364国王(King)

    // 题意 问是否存在一个长度为n的序列// 这个序列满足m个限制// 每个限制有 si ni oi kisi 为序列位置 ni为从si开始连续长度为ni+1 的子序列 这些子序列和 大于或小于 ki ...

  7. sql给数据库加锁问题

    加锁是在操作数据时进行了,不能事后加锁. 例: begin   tran           insert   表   with(TABLOCKX)     --加锁           (字段列表) ...

  8. 【Unity3D】Unity自带组件—完成第一人称人物控制

    1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...

  9. 【转】android 自定义控件 使用declare-styleable进行配置属性(源码角度)

    原文网址:http://blog.csdn.net/vipzjyno1/article/details/23696537 最近在模仿今日头条,发现它的很多属性都是通过自定义控件并设定相关的配置属性进行 ...

  10. linux下利用backtrace追踪函数调用堆栈以及定位段错误

    一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...