题目链接:http://poj.org/problem?id=2387

Dijkstra算法:    //求某一点(源点)到另一点的最短路,算法其实也和源点到所有点的时间复杂度一样,O(n^2);

图G(V,E),设置一个顶点集合S,不断贪心选择,指导S扩充为V,计算结束。

贪心选择的方法:节点个数n,源节点v,先在S中加入源节点v,初始化源节点,开始扩充S,找到一个点,他离S集合最近,加入到S集合中去,再利用这个点更新S本身中的最短路径。

题目大意:很裸的Dijkstra,但是这里有两点

1、图是双向的,存图的时候存双向图。

2、有重边,两个点之间有多条边,不断更新

模板:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NUM 1005
#define maxint (1<<29) using namespace std; int c[NUM][NUM];
int dist[NUM];
int pre[NUM]; ///Dijkstra
///顶点个数n,源点v
///数组dist保存从源点v到每个顶点的最短特殊路径长度
///数组prev保存每个顶点在最短路径上的前一个节点
void dijkstra (int n,int v,int dist[],int prev[],int c[][NUM])
{
int i,j;
bool s[NUM];
///初始化数组
for(i=; i<=n; i++)
{
dist[i] = c[v][i];
s[i]=false;
if(dist[i]>maxint) prev[i]=;
else prev[i] = v;
} ///初始化源节点
dist[v] = ;
s[v] = true;
for(i=; i<n; i++) ///其余节点
{
/// 在数组dist中寻找未处理节点的最小值
int tmp = maxint;
int u = v;
for(j=; j<=n; j++)
{
if(!s[j]&&(dist[j]<tmp))
{
u=j;
tmp=dist[j];
}
} s[u] = true; ///节点u加入s中
///利用节点u更新数组dist
for(j=; j<=n; j++)
{
if(!s[j]&&c[u][j]<maxint)
{
///newdist为从源节点到该点的最短特殊路径
int newdist = dist[u] + c[u][j];
if(newdist<dist[j])
{
///修改最短路径
dist[j]=newdist;
///修改j的前一个节点
prev[j]=u;
}
}
}
}
} ///根据数组pre计算单源最短路径的算法
/*
void traceback (int v,int i,int prev[])
{
printf("%d<--",i);
i=prev[i];
if(i!=v) traceback(v,i,prev);
if(i==v) printf("%d",i);
}
*/ ///根据数组pre计算源点v到所有其他顶点最短路径的迭代算法
/*
for(int j=2;j<=n;j++)
{
printf("%d",j);
int t=pre[j];
while(t!=1)
{
printf("<--%d",t);
t=pre[t];
}
printf("<--1\n");
}
*/ int main()
{
int n,v;
for(int i=; i<NUM; i++)
{
for(int j=; j<NUM; j++)
c[i][j] = maxint + ;
}
scanf("%d%d",&v,&n);
for(int i=; i<=v; i++)
{
int father,son,val;
scanf("%d%d%d",&father,&son,&val);
c[father][son]=c[son][father]=min(c[son][father],val);
}
dijkstra(n,n,dist,pre,c);
printf("%d\n",dist[]);
return ;
}

Dijkstra单源最短路径,POJ(2387)的更多相关文章

  1. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  2. Dijkstra——单源最短路径

    算法思想 ①从一个源点开始,找距离它最近的点顶点v ②然后以顶点v为起点,去找v能到达的顶点w,即v的邻居 比较源点直接到 v的距离和(源点到v的距离+v到w的距离) 若大于后者则更新源点的到w的开销 ...

  3. 【模板 && 拓扑】 Dijkstra 单源最短路径算法

    话不多说上代码 链式前向星233 #include<bits/stdc++.h> using namespace std; ,_max=0x3fffffff; //链式前向星 struct ...

  4. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

  5. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  6. POJ 1135 -- Domino Effect(单源最短路径)

     POJ 1135 -- Domino Effect(单源最短路径) 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两 ...

  7. 单源最短路径算法---Dijkstra

    Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...

  8. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  9. 【转】Dijkstra算法(单源最短路径)

    原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...

随机推荐

  1. python模块之urllib

    python文档官网地址:https://docs.python.org/3.6/library/urllib.html?highlight=urllib urllib 是一个收集以下模块以处理URL ...

  2. java——io、字节流缓冲区拷贝文件、字节缓冲流

    使用try catch finally关闭文件流: 写入文件: import java.io.*; public class exp{ public static void main(String[] ...

  3. error creating bean with name 'defaultvalidator' defined in class path resource

    场景: 1.直接用eclipse 运行没问题(本地用的tomcat是7.0.70): 2.打包发布到服务器运行也没问题(服务器tomcat是8.5.30): 3.将打包发布的放到本地tomcat(7. ...

  4. tomcat正常关闭,端口号占用解决 StandardServer.await: create[8005]:

    cmd进入依次输入以下三个命令 1:netstat -ano | findstr "8005"2:tasklist | findstr "5632" 3:tas ...

  5. JAVA中 List和ArrayList的区别

    List是一个接口,而ListArray是一个类.  ListArray继承并实现了List.  所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造.  ...

  6. windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变

    # 原因:因为%SystemRoot%\system32 在引用这个环境变量时,会默认C:\Windows\System32下的jdk版本 # 解决方法: 把jdk的配置放在path前面就可以了

  7. SQL Server 硬件和软件要求

    1. 2.

  8. 使用python将元组转换成列表,并替换其中元素

    aa = (1, 2, 3, 4, 5, 6) b = [(x == 5 and 8 or x) for x in aa] z = map(lambda x: 8 if x == 5 else x, ...

  9. Andrew Ng 的 Machine Learning 课程学习 (week3) Logistic Regression

    这学期一直在跟进 Coursera上的 Machina Learning 公开课, 老师Andrew Ng是coursera的创始人之一,Machine Learning方面的大牛.这门课程对想要了解 ...

  10. 嵌入式 C 语言编程总结

    嵌入式 C 语言编程总结 目录: 全局变量 1.全局变量 在纯 C 语言(Pure C)开发的嵌入式程序中,需要在多处用到同一个变量,需要注意几点: 不要在头文件中对变量进行定义 头文件中变量的声明添 ...