hdu 3790 最短路径问题(迪杰斯特拉)
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20555 Accepted Submission(s):
6098
a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数
s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
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 最短路径问题(迪杰斯特拉)的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 最短路径之迪杰斯特拉算法(Java)
1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- JS实现最短路径之迪杰斯特拉(Dijkstra)算法
最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
- hdu 3339 In Action(迪杰斯特拉+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...
随机推荐
- Data Lake Analytics IP白名单设置攻略
当我们成功开通了 DLA 服务之后,第一个最想要做的事情就是登录 DLA 数据库.而登录数据库就需要一个连接串.下面这个页面是我们首次开通 DLA 之后的界面,在这里我们要创建一个服务访问点. 在上面 ...
- 模拟7题解 T1方程的解
方程的解 [扩展欧几里德] 首先进行特判,两个小时基本想到了,除了a!=0,b==0,a*c<0这种情况 其次就是一般情况: 首先exgcd求出ax+by=GCD(a,b)的一组任意解 然后两边 ...
- 【CS Round #44 (Div. 2 only) B】Square Cover
[链接]点击打开链接 [题意] 给你一个n*m的矩形,让你在其中圈出若干个子正方形,使得这些子正方形里面的所有数字都是一样的. 且一样的数字,都是在同一个正方形里面.问你有没有方案. [题解] 相同的 ...
- CSS-DOM的小知识(一)
在DOM编程艺术中,CSS-DOM应用很广泛. 1.style属性 通过element.style.property可以获得元素的样式,但是style属性只能够返回内嵌样式,对于外部样式表的样式和he ...
- Poj 1830 高斯消元
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5418 Accepted: 2022 Description 有N个相 ...
- hdu 4027 Can you answer these queries? (区间线段树,区间数开方与求和,经典题目)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- 【水滴石穿】ReactNative-Redux-Thunk
老实说,运行出来的项目让人失望,毕竟我想看各种有趣的demo啊- 先放上源码地址:https://github.com/ludejun/ReactNative-Redux-Thunk 我们来一起看看代 ...
- PHPCMS 按点击量排序
{pc:content action="hits" catid="12" num="4" order="views DESC&qu ...
- 读JS高性能总结——DOM编程(一)
DOM是一个与语言无关的API,它在浏览器中的借口却是用JS来实现的. 浏览器通常会把DOM和JS独立实现. 在IE中,JS的实现名是JScript,位于jscript.dll文件中,DOM实现则是m ...
- Linux安装mongoDB步骤和方法
Linux安装mongoDB步骤和方法 下载mongoDB数据库 mongodb-linux-x86_64-3.0.15.tgz 存放到linux文件夹中 ftp软件直接拖上去 解压文件夹(解压后,会 ...