题目链接: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. sharepoint Linq方式的增,删,查,改

    Site9527EntitiesDataContext (重要的类):连接实体与网站List操作 SPContext.Current.Web.Url:获取当前操作的页面 FirstOrDefault: ...

  2. HDU 1695 (莫比乌斯反演) GCD

    题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...

  3. POJ 3253 Fence Repair【二叉堆】

    题意:给出n根木板,需要把它们连接起来,每一次连接的花费是他们的长度之和,问最少需要多少钱. 和上一题果子合并一样,只不过这一题用long long 学习的手写二叉堆的代码,再好好理解= = #inc ...

  4. [swustoj 1023] Escape

    Escape     Description BH is in a maze,the maze is a matrix,he wants to escape! Input The input cons ...

  5. Android开发时提示Your project contains error(s),please fix them be

    有次在使用eclipse写好Android的代码,代码没有报错.然后 想在AVD中运行测试时,总是会弹出错误框,提示信息为:    “Your project contains error(s),pl ...

  6. vs2013编译boost库

    打开vs2013>>visual studio tools>>VS2013 x64 本机工具命令提示 cd D:\lib\boost_1_55_0\boost_1_55_0 b ...

  7. 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...

  8. javascript OOP编辑思想的一个实践参考

    <html> <style type="text/css"> .current { background-color: red; } .dv { backg ...

  9. (转)TCP协议那些事

    (上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...

  10. zoj 2027 Travelling Fee

    // 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ...