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 ...
随机推荐
- 模拟4题解 T1礼物
T1 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种 礼物的喜悦值不能重复获得). 每次, ...
- 如何把pdf文档转化为word
在工作中常常遇到大量的pdf文档,再加工进行处理文件,特别的不方便,需要转换为WORD. 尝试如下: 使用wps自带的工具转换,提示需要是会员才能进行.否则只能进行5页以下的转换. 再想是不是又有个这 ...
- WPF 触发器例子
WPF的触发器很强大,这里简单附上触发器的一个小例子,分别用XMAL和CS代码来实现一个功能,鼠标悬停在button上时改变字体颜色 1.XMAL代码如下: <Window x:Class=&q ...
- Codeforces Beta Round #77 (Div. 2 Only) A. Football【字符串/判断是否存在连续7个0或7个1】
A. Football time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Lichee ( 四 ) 打包IMAGE
在<Lichee(三) Android4.0的目标产品文件夹与Lichee的纽带---extract-bsp>中我们分析了extract-bsp的作用和意义.到这里,我们能够開始编译And ...
- JSP Web第四章整理复习 JSP技术基础
P104 JSP简介 (1)基本概念:jsp技术.jsp.jsp网页组成 JSP技术基础java servlet和整个java体系的Web服务器端开发技术. JSP表示它是用java写的Web服务页面 ...
- windows10 中微信(UWP)版本不显示通知消息
前言: 前段时间笔者更换了升级了WINDOWS10系统,从应用商店安装微信后,使用期间不会推送消息通知,右下角的通知栏也无法添加微信图标.搜索百度和Google后,发现很多人都是这样,这是微信(UWP ...
- JMeter与LoadRunner的对比
1. 界面.安装.协议支持.函数库.成本.开源 2. 都可以实现分布式负载,相对来说LoadRunner更强大一些 3. 都支持在windows和linux环境的负载生成器.控制台方面,Jmeter跨 ...
- java定时(循环)执行一个方法
java中设置定时任务用Timer类可以实现. 一.延时执行 首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行.代码如下: package test ...
- react-cnode
感谢无私开源的程序员们~~~代码因为你们更加美腻~ //根index.js import React, { Fragment } from 'react'; import ReactDOM from ...