题目链接: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. bzoj1064

    很巧妙的题 首先有几种情况 1. 有环 2.两点间有多条路径 3.其他 3.显然最简单,最小是3,最大是每个弱联通块中最长链 2.显然,两点间两条路径的差是答案的倍数 1.出现环,那答案一定是其约数, ...

  2. bzoj1406: [AHOI2007]密码箱

    数学. x^2 % n = 1 则 (x+1)(x-1) = kn. 设 x+1 = k1*n1, x-1=k2*n2. 则 k1*k2=k , n1*n2=n. 算出每个大于sqrt(n)的约数,然 ...

  3. SharePoint CMAL方式处理的 增,删,查,改

    SPContext.Current.Web.Lists["UserInfo"]:获取网站的List,名称是:UserInfo userlist.AddItem():添加数据到Lis ...

  4. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

  5. POJ 1088 滑雪【记忆化搜索】

    题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径 记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已 ...

  6. 【解决方案】jquery live的change事件在IE下失效

    $("#spanChildSec select").live("change", function () {              //处理内容       ...

  7. unsigned 和 signed

    http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html http://m.blog.csdn.net/blog/u0100862 ...

  8. Asp.Net MVC4 系列-- 进阶篇之路由(1)【转】

    http://blog.csdn.net/lan_liang/article/details/22993839?utm_source=tuicool

  9. extjs form submit 总是执行failure

    代码: function createWeekReort() { if (form.getForm().isValid()) { Ext.Msg.confirm("提示", &qu ...

  10. Linux--使用expect进行自动交互

    在linux下进行一些操作时,有时需要与机器进行一些交互操作,比如切换账号时输入账号密码,传输文件时输入账号密码登陆远程机器等,但有时候这些动作需要在shell脚本中进行,这个时候就可以使用expec ...