最短路径问题

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

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
 
Source
 
Recommend
notonlysuccess   |   We have carefully selected several
similar problems for you:  1142 2680 1385 1598 1596 
 
同样是最短路的模板题,不过加入了花费这个元素,当路程相同时,选择花费小的方案,还是比较好处理的。
 
题意:中文题,很好理解。
 
附上代码:
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#define M 1005
#define MAX 0x3f3f3f3f
using namespace std;
int map[M][M],vis[M],dis[M],money[M][M],r[M];
int main()
{
int n,m,i,j,s,t;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break;
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(r,,sizeof(r));
for(i=; i<=n; i++)
for(j=; j<=n; j++)
{
if(i==j) map[i][j]=,money[i][j]=;
else map[i][j]=MAX,money[i][j]=MAX;
}
int a,b,c,d;
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(map[a][b]>c)
{
map[a][b]=c,map[b][a]=c;
money[a][b]=d,money[b][a]=d;
}
}
scanf("%d%d",&s,&t);
vis[s]=;
for(i=; i<=n; i++)
{
dis[i]=map[s][i];
r[i]=money[s][i];
}
int w,min;
for(i=; i<=n; i++)
{
min=MAX;
for(j=; j<=n; j++)
if(!vis[j]&&min>dis[j])
{
min=dis[j];
w=j;
}
vis[w]=;
for(j=; j<=n; j++)
{
if(!vis[j]&&map[w][j]<MAX)
{
if(dis[j]>dis[w]+map[w][j])
{
dis[j]=dis[w]+map[w][j];
r[j]=r[w]+money[w][j];
}
else if(dis[j]==dis[w]+map[w][j] && r[j]>r[w]+money[w][j]) //路程相同时,花费的处理
r[j]=r[w]+money[w][j];
}
}
}
printf("%d %d\n",dis[t],r[t]);
}
return ;
}

邻接表:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define M 1005
#define N 100005
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m,s,t,tol;
struct Edge
{
int from,to,val,p;
int next;
} edge[N*];
int head[N*],dis[M],r[M];
bool vis[M]; void init()
{
tol=;
memset(head,-,sizeof(head));
} void addEdge(int u,int v,int val,int p)
{
edge[tol].from=u;
edge[tol].to=v;
edge[tol].val=val;
edge[tol].p=p;
edge[tol].next=head[u];
head[u]=tol++;
edge[tol].from=v;
edge[tol].to=u;
edge[tol].val=val;
edge[tol].p=p;
edge[tol].next=head[v];
head[v]=tol++;
} void getmap()
{
int i,j;
int a,b,c,d;
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
addEdge(a,b,c,d);
}
scanf("%d%d",&s,&t);
memset(dis,INF,sizeof(dis));
memset(r,INF,sizeof(r));
memset(vis,false,sizeof(vis));
} void spfa()
{
queue<int>q;
q.push(s);
dis[s]=;
r[s]=;
vis[s]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u]; i!=-; i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
r[v]=r[u]+edge[i].p;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
else if(dis[v]==dis[u]+edge[i].val)
{
if(r[v]>r[u]+edge[i].p)
{
r[v]=r[u]+edge[i].p;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
}
printf("%d %d\n",dis[t],r[t]);
return;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==&&m==) break;
init();
getmap();
spfa();
}
return ;
}

hdu 3790 最短路径问题(迪杰斯特拉)的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 最短路径之迪杰斯特拉算法(Java)

    1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...

  3. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  4. 最短路径之迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  5. JS实现最短路径之迪杰斯特拉(Dijkstra)算法

    最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...

  6. 最短路径之迪杰斯特拉算法的Java实现

    Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...

  7. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

  8. hdu 3339 In Action(迪杰斯特拉+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  10. 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...

随机推荐

  1. 洛谷P1965 转圈游戏 [2013NOIP提高组 D1T1][2017年6月计划 数论04]

    P1965 转圈游戏 题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  2. Leetcode73. Set Matrix Zeroes矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ] 输 ...

  3. (转)Sql server中 如何用sql语句创建视图

    1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释:     在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,     采购人员,可以需要一些与其 ...

  4. reverse 的用法

    直接对数组或是数据结构使用 #include<bits/stdc++.h> using namespace std; ]={,,,,,};//申请6个元素,下标从0开始,最后一个下标是5 ...

  5. 杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动

    ylbtech-杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动 1.返回顶部 1. 天气暖和了,连心情都是阳光的.然而,在这美好的时刻,漫天飞舞的杨柳絮,甚是煞风景.<ignor ...

  6. Docker.[3].镜像操作.

    Docker.[3].镜像操作. 熟悉基础指令: 查看本地镜像 docker images 查看本地镜像 docker image list (和上面显示的结果一样.) 删除本地镜像 docker r ...

  7. iOS 使用Quartz和OpenGL绘图

    http://blog.csdn.net/coder9999/article/details/7641701 第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Qu ...

  8. 第三十一讲:UML类图(上)

    类名 成员变量:属性 成员函数:方法 访问权限-属性名-属性的类型 访问权限-方法名-返回值,还可以传递参数列表. 继承类的类图 JAVA里面类的访问权限只有两种:package(默认的访问权限)和p ...

  9. tomcat配置证书

    [size=x-small][size=xx-large][size=medium] 1.利用java 生成一个.keystore文件 进入命令行(假设已经设定了环境变量) 执行 keytool -g ...

  10. SQL语句问题具体什么意思呢?

    SQL语句问题 底下SQL查询语法中的 as A 和 as B 是什么意思?为什么A和B不用定义就能用? 程序代码:     Private Sub LoadFileList(ByVal strSub ...