HDU 1874 最直接的最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
#include <cstdio>
#include <algorithm>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> pii;
#define N 205
#define M 1005
#define MAXN 0x3f3f3f3f
int y[M],d[M],next[M];
int first[N],dp[N];
int k; //写完函数后这两句话老是忘记写,所以还是这样一开始就写在一个函数里这样自己就不会忘了
void init()
{
k=;
memset(first,-,sizeof(first));
}
void add(int a,int b,int c)
{
y[k]=b,d[k]=c,next[k]=first[a];
first[a]=k;
k++;
} void dijkstra(int src)
{
priority_queue<pii,vector<pii>,greater<pii> > q;
memset(dp,0x3f,sizeof(dp));
dp[src]=,q.push(make_pair(,src));
while(!q.empty()){
while(!q.empty()&&dp[q.top().second]<q.top().first) q.pop();
if(q.empty()) break;
int u=q.top().second;
q.pop();
for(int i=first[u];i!=-;i=next[i]){
if(dp[y[i]]>dp[u]+d[i]){
dp[y[i]]=dp[u]+d[i];
q.push(make_pair(dp[y[i]],y[i]));
}
}
}
} int main()
{
int n,m,a,b,c,s,t;
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
scanf("%d%d",&s,&t);
dijkstra(s);
if(dp[t]<MAXN) printf("%d\n",dp[t]);
else printf("%d\n",-);
} return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN 20010
#define N 205
int v[MAXN],d[MAXN],next[MAXN],first[N],visit[N],dp[N];
int k;//k表示路的条数 void add(int x,int y,int a)//这里添加的是无向图的边,所以进行两次
{
v[k]=y;
next[k]=first[x];
d[k]=a;
first[x]=k;
k++;
v[k]=x;
next[k]=first[y];
d[k]=a;
first[y]=k;
k++;
} int spfa(int a,int b)
{
memset(dp,0x3f,sizeof(dp));
//memset(visit,0,sizeof(visit));//这一段是没有必要的,每次spfa做完,他都会最后变为0
queue<int> q;
dp[a]=,visit[a]=;
q.push(a);
while(!q.empty()){
int c=q.front();
q.pop();
visit[c]=;
for(int i=first[c];i!=-;i=next[i]){
if(dp[v[i]]>dp[c]+d[i]){
dp[v[i]]=dp[c]+d[i];
if(!visit[v[i]]) q.push(v[i]),visit[v[i]]=;
}
}
}
if(dp[b]<0x3f3f3f3f) return dp[b];
else return -;
} int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
k=;
memset(next,-,sizeof(next));
memset(first,-,sizeof(first));
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
add(x,y,a);
}
scanf("%d%d",&start,&End);
printf("%d\n",spfa(start,End));
}
return ;
}
Floyd:
在使用Floyd时应该把矩阵每个点一开始做好初始化,主对角线上均为0;
其他定位一个最大值。
PS:这道题比较坑的地方是两地间可以有多条路,我们要判断是否为较小的路放入矩阵中
floyd是基于建立在2维矩阵中的,每次更新出一个到达 i 的最短路径,都要遍历一次矩阵,把所有其他节点到 i 点最小值不断更新出来,因为这道题城镇数目比较少,可以采取这种
复杂度为O(n^3)的方法,但是通过这个方法我们可以确定任意一点到其他点的最短路径(自我感觉类似于打表法,有木有?!),不像SPFA做一次只能找到你所需的最短路径
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 205
#define MAXN 0x3f3f3f3f
int mat[N][N]; void Floyd(int n)//为n*n的矩阵
{
for(int i=;i<n;i++){
for(int j=;j<n;j++){
for(int k=;k<n;k++){
if(mat[j][k]>mat[j][i]+mat[k][i])
mat[j][k]=mat[j][i]+mat[k][i];//i只是用来计更新次数的,实际上每更新一次,都要将整个矩阵的所有点都遍历一遍
} //所以是mat[j][k];
}
}
}
int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
memset(mat,0x3f,sizeof(mat));
for(int i=;i<n;i++) mat[i][i]=;
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
a=min(a,mat[x][y]);
mat[x][y]=a,mat[y][x]=a;//在这里要判断一下,因为两地之间可以有多条路,我们需要判断它到底是否为我们要的最短路
}
scanf("%d%d",&start,&End);
Floyd(n);
if(mat[start][End]<MAXN) printf("%d\n",mat[start][End]);
else printf("-1\n");
}
return ;
}
BellMan-ford:
在写BellMan时,没必要写first[]数组了
它执行一次只能找到固定对应的a到b的最短距离,在这一点上是远远不如Floyd的,而且复杂度为O(n*k),在数据量特别大时是不适用的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 205
#define M 20005
#define MAXN 0x3f3f3f3f
int u[M],v[M],d[M],k;
int dp[N];
void add(int x,int y,int a)
{
u[k]=x,v[k]=y,d[k]=a;
k++;
}
void BellMan(int n,int src)
{
memset(dp,0x3f,sizeof(dp));
dp[src]=;
for(int i=;i<n;i++)
{
for(int j=;j<k;j++)
if(dp[v[j]]>dp[u[j]]+d[j])
dp[v[j]]=dp[u[j]]+d[j];
}
}
int main()
{
int n,m,start,End,x,y,a;
while(scanf("%d%d",&n,&m)!=EOF){
k=;
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&a);
add(x,y,a);
add(y,x,a);
}
scanf("%d%d",&start,&End);
BellMan(n,start);
if(dp[End]<MAXN) printf("%d\n",dp[End]);
else printf("-1\n");
}
return ;
}
HDU 1874 最直接的最短路径问题的更多相关文章
- HDU 1874 畅通project续 最短路径入门(dijkstra)
Problem Description 某省自从实行了非常多年的畅通project计划后,最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案 ...
- HDU 1874 畅通project续 (最短路径)
畅通project续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...
- hdu 2544 hdu 1874 poj 2387 Dijkstra 模板题
hdu 2544 求点1到点n的最短路 无向图 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 ...
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- HDU - 1874 畅通工程续(最短路径)
d.已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. s.最短路径 c.Dijkstra单源最短路 /* Dijkstra单源最短路 权值必须是非负 单源最短路径,Dijkstra算法 ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
随机推荐
- A. The Fault in Our Cubes 暴力dfs
http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行, ...
- LVS实现负载均衡
三台主机模拟 sishen_63(分发器): eth0(Bridge):192.168.1.63 eth1(vmnet4):192.168.2.63 sishen_64(RealServer1): e ...
- 【前端】jQurey Plugin
; (function ($, window, document, undefined) { "use strict"; var defaults = { name: " ...
- Android程序打包为APK
Andriod安装包文件(Android Package),简称APK,后缀名为.apk. 1.生成未签名的安装包 Build -> Build Bundle(s)/APK(s) -> B ...
- vue中引入字体图标报错,找不到字体文件
在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...
- iOS 音频视频制作
--iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...
- Oracle体系结构总览
第一篇 Oracle架构总览 先让我们来看一张图 这张就是Oracle 9i的架构全图.看上去,很繁杂.是的,是这样的.现在让我们来梳理一下: 一.数据库.表空间.数据文件 1.数据库 数据库是数 ...
- iOS UI异步更新:dispatch_async 与 dispatch_get_global_queue 的使用方法
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- vue路由高级语法糖
1.当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active. 模板中可以用{{$route.params.xxx取到路由 ...
- 工作笔记:复制文件--从windows到ubuntu,再到fedora
最近在测试跨平台类库,于是写了一些小程序. 当然主要利用vs进行主要的代码开发.eclipse进行linux的调试. 那么需要不时同步项目文件. 考虑到项目简单,所以没有使用svn. 1. 从wind ...