3790:最短路径问题(HDU)
(1<n<=1000, 0<m<100000, s != t)
1 #include<iostream>
2 #include<map>
3 #include<cstdio>
4 using namespace std;
5 #define inf 1000000000
6 int s, t;
7 int n, m,k;
8 struct di
9 {
10 int s, money;
11 }dis[1010];
12 struct e
13 {
14 int from, to, distance, cost;
15 }es[100010];
16 void ds()
17 {
18 dis[s].s = 0;
19 while (true)
20 {
21 bool update = false;
22 for (int i = 0; i < k; i++)
23 {
24 if (dis[es[i].from].s != inf && (dis[es[i].to].s > dis[es[i].from].s + es[i].distance ))
25 {
26 dis[es[i].to].s = dis[es[i].from].s + es[i].distance;
27 dis[es[i].to].money = dis[es[i].from].money + es[i].cost;
28 update = true;
29 }
30 else if(dis[es[i].to].s == dis[es[i].from].s + es[i].distance&&dis[es[i].to].money > dis[es[i].from].money + es[i].cost)
31 {
32 dis[es[i].to].s = dis[es[i].from].s + es[i].distance;
33 dis[es[i].to].money = dis[es[i].from].money + es[i].cost;
34 }
35 }
36 if (!update) break;
37 }
38 printf("%d %d\n", dis[t].s, dis[t].money);
39 }
40 int main()
41 {
42 while (cin >> n >> m, n != 0 && m != 0)
43 {
44 k = 0;
45 for (int i = 0; i < m; i++)
46 {
47 int a, b, c, d;
48 scanf("%d %d %d %d", &a,&b,&c,&d);
49 es[k].from = a, es[k].to = b, es[k].distance = c, es[k++].cost = d;
50 es[k].from = b, es[k].to = a, es[k].distance = c, es[k++].cost = d;
51 }
52 for (int i = 0; i <= n; i++)
53 {
54 dis[i].s = inf;
55 dis[i].money = 0;
56 }
57 scanf("%d %d", &s, &t);
58 ds();
59 }
60 return 0;
61 }
这是网上大佬的方法,为方便复习,拿来用了;
思路是djkstra的算法,当时我也想用了的,就是不太清楚cost给怎么定义,所以就用了bellman-ford,下次用队列优化的bellman-ford试试
1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #define maxn 1007
5 #define INF 65535
6 using namespace std;
7
8 int start,e;
9 int n,m;
10 int map[maxn][maxn];
11 int cost[maxn][maxn];
12
13 void Dijkstra()
14 {
15 int v,Min,vis[maxn];
16 int d[maxn],c[maxn];
17 for(int i = 1;i <= n;i++) {
18 d[i] = map[start][i];
19 c[i] = cost[start][i];
20 }
21 memset(vis,0,sizeof(vis));
22 vis[start] = 1;
23 for(int i = 1;i <= n;i++)
24 {
25 if(vis[e]) break;
26 Min = INF;
27 for(int j = 1;j <= n;j++)
28 if(!vis[j] && d[j]<Min)
29 Min = d[v=j];
30 vis[v] = 1;
31 for(int j = 1;j <= n;j++)
32 if(!vis[j] && map[v][j]<INF) {
33 if(d[j] > d[v]+map[v][j]) {
34 d[j] = d[v]+map[v][j];
35 c[j] = c[v]+cost[v][j];
36 }
37 else if(d[j] == d[v]+map[v][j])
38 if(c[j] > c[v]+cost[v][j])
39 c[j] = c[v]+cost[v][j];
40 }
41 }
42 printf("%d %d\n",d[e],c[e]);
43 }
44
45 int main()
46 {
47 while(scanf("%d%d",&n,&m) && n+m)
48 {
49 for(int i = 1;i <= n;i++)
50 for(int j = 1;j <= n;j++) {
51 map[i][j] = i==j?0:INF;
52 cost[i][j] = i==j?0:INF;
53 }
54 int a,b,c,d;
55 for(int i = 1;i <= m;i++)
56 {
57 scanf("%d%d%d%d",&a,&b,&c,&d);
58 if(map[a][b]>c)
59 {
60 map[a][b]=map[b][a]=c;
61 cost[a][b]=cost[b][a]=d;
62 }
63 else if(map[a][b]==c)
64 {
65 if(cost[a][b]>d)
66 cost[a][b]=cost[b][a]=d;
67 }
68 }
69 scanf("%d%d",&start,&e);
70 Dijkstra();
71 }
72 return 0;
73 }
3790:最短路径问题(HDU)的更多相关文章
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- HDU ACM 3790 最短路径问题
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- 最短路径问题 HDU 3790
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 题解报告:hdu 3790 最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
随机推荐
- 5.22 HTML 列表标签和表单标签
1,ul无序列表 标签 ul:unordered list ,就是无序列表的意思. li: listitem 列表项的意思.无序列表的每一项都是<li>. <!DOCTYPE h ...
- linux 基础笔记本
ubuntu 端口使用查看 查看已经连接的服务端口(ESTABLISHED) netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap 查看指定端口,可 ...
- 使用Retrofit时常用到的注解
- python - 练习统计随机字母数据
# 随机字母,统计每个字母的数量: # 1.按a-z 的方式 显示每个字母的数量 # 2.按从多到少的方式 显示每个字母的数据 info= "fkdsfkasefhjsadfjagroekl ...
- php编程 之php基础 表单
1 ,php表单 当处理php表单的时候,php能把来自html页面的表单元素自动变成可供php脚本使用的数据. 比如: <html> <head> <meta char ...
- 20165237 学习基础和C语言基础调查
学习基础和C语言基础调查 一.技能学习与特长 你有什么技能比大多人(超过90%以上)更好? 我的爱好和技能说实话挺广泛的.如果要挑出来一个很擅长的话,我觉得应该是钢琴. 针对这个技能的获取你有什么成功 ...
- quartz定时任务的简单使用
开发环境: springmvc quartz-2.2.3在官网下载的. 步骤: 1.首先在web.xml中加入以下代码: <servlet> <servlet-name>Qua ...
- Windows PowerShell 入門(8)-関数編3
この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...
- Boost.Asio的使用技巧
基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...
- 008_falcon磁盘io计算方法
一.falcon磁盘IO告警计算方法 (1)线上告警示例 [falcon]环境: prod 时间: 2018-11-10 22:29 共1条 [#主机磁盘io过高(appid)]主机hostname磁 ...