最朴素的做法o(V*V/2+2E)~O(V^2)
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<string.h>
const int MAX = 2002;
int n;
int graph[MAX][MAX];
int dis[MAX];
bool vis[MAX];
const int INF = 0X7FFFFFFF;
int dijkstra()
{
memset(vis, false, sizeof(vis));
vis[1] = true;
for (int i = 1; i <= n; i++)
dis[i] =INF;
dis[1] = 0;
for (int i = 1; i <= n; i++)
{
if (graph[i][1] != 0)
dis[i] = graph[i][1];
}

for (int i = 0; i < n-1; i++)
{
int minn = INF, position = 1;
for (int i = 1; i <= n; i++)
{
if (!vis[i] && minn>dis[i])
{
minn = dis[i];
position = i;
}
}
vis[position] = true;
for (int i = 1; i <= n; i++)
{
if (!vis[i] &&graph[i][position]!=0&&dis[i] > (dis[position] + graph[i][position]))
dis[i] = dis[position] + graph[i][position];
}
}

return dis[n];
}

int main()
{

int t;
cin >> t>> n;
memset(graph, 0, sizeof(graph));
for (int i = 0; i < t; i++)
{
int x1, y1, val;
cin >> x1 >> y1 >> val;
if (graph[x1][y1])
{
if (graph[x1][y1]>val)
graph[x1][y1] = graph[y1][x1] = val;
}
else
{
graph[x1][y1] = graph[y1][x1] = val;
}

}
cout << dijkstra() << endl;
return 0;
}

/*

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

*/

最短路的优先队列做法,时间复杂度O(2E+VlogV)~o(vlgv)

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<algorithm>
struct node
{
int x, d;
node(int _x, int _d) :x(_x), d(_d){}
bool operator< (const node &b) const{
return d > b.d;
}
};
const int MAX = 2002;
int n;
int graph[MAX][MAX];
vector<vector<int>> edges(MAX);
int dis[MAX];
bool vis[MAX];
const int INF = 0X7FFFFFFF;

int dijkstra()
{
memset(vis, false, sizeof(vis));
priority_queue<node> que;

for (int i = 1; i <= n; i++)
dis[i] =INF;
dis[1] = 0;

que.push(node(1, 0));

while (!que.empty())
{
node tmp = que.top();
que.pop();
if (vis[tmp.x]) continue;
vis[tmp.x] = true;
for (int i = 0; i < edges[tmp.x].size(); i++)
{
if (!vis[edges[tmp.x][i]] && graph[edges[tmp.x][i]][tmp.x]!=0 && dis[edges[tmp.x][i]]>(dis[tmp.x] + graph[edges[tmp.x][i]][tmp.x]))
{
dis[edges[tmp.x][i]] = graph[edges[tmp.x][i]][tmp.x] + dis[tmp.x];
que.push(node(edges[tmp.x][i], dis[edges[tmp.x][i]]));
}
}

}

return dis[n];
}

int main()
{

int t;
cin >> t>> n;
memset(graph, 0, sizeof(graph));
edges.resize(MAX);

for (int i = 0; i < t; i++)
{
int x1, y1, val;
cin >> x1 >> y1 >> val;
if (graph[x1][y1])
{
if (graph[x1][y1]>val)
{
graph[x1][y1] = graph[y1][x1] = val;
}
}
else
{
graph[x1][y1] = graph[y1][x1] = val;
edges[x1].push_back(y1);
edges[y1].push_back(x1);
}

}
cout << dijkstra() << endl;
return 0;
}

/*

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

*/

dijkstra 最短路算法的更多相关文章

  1. Dijkstra最短路算法

    Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...

  2. 【坐在马桶上看算法】算法7:Dijkstra最短路算法

           上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...

  3. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  4. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  5. 对于dijkstra最短路算法的复习

    好久没有看图论了,就从最短路算法开始了. dijkstra算法的本质是贪心.只适用于不含负权的图中.因为出现负权的话,贪心会出错. 一般来说,我们用堆(优先队列)来优化,将它O(n2)的复杂度优化为O ...

  6. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...

  7. python dijkstra 最短路算法示意代码

    def dijkstra(graph, from_node, to_node): q, seen = [(0, from_node, [])], set() while q: cost, node, ...

  8. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  9. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

随机推荐

  1. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  2. AC日记——找最大数序列 openjudge 1.9 10

    10:找最大数序列 总时间限制:  1000ms 内存限制:  65536kB 描述 输入n行,每行不超过100个无符号整数,无符号数不超过4位.请输出最大整数以及最大整数所在的行号(行号从1开始). ...

  3. AC日记——统计数字字符个数 openjudge 1.7 01

    01:统计数字字符个数 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 输出为1行,输出字符串 ...

  4. gzip: stdout: No space left on device问题的解决

    一.问题描述 最近安装了ubuntu14.04,并在ubuntu14.04中编译了一次内核.这之后大部分情况下用sudo apt-get install 安装应用都会出现“gzip: stdout: ...

  5. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令

    利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...

  6. [NOIP2010初赛]烽火传递+单调队列详细整理

    P1313 [NOIP2010初赛]烽火传递 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述   烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上 ...

  7. top状态及其常用技巧

    看tcp状态 /bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'   在 top 状态下,按 "shif ...

  8. C# 多重overide

    overide 是覆盖的意思,用在且仅用在虚函数上,虚函数可以是virtual或abstract修饰的,或者是overide修饰的. 文档大概是这么说的. 由此知道,由overide修饰的函数都是虚函 ...

  9. mac上如何卸载oracle jdk 1.7

    目前mac上有一些软件还不支持jdk1.7,只能卸载1.7,恢复到1.6,下面二个链接是官网给出的卸载方法: http://www.java.com/zh_CN/download/help/mac_u ...

  10. Nodejs进阶:核心模块https 之 如何优雅的访问12306

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严 ...