/* 在网图和非网图中,最短路劲的含义是不同的 -网图是俩顶点经过的边上权值之和最少的路劲 -非网图是俩顶点之间经过的边数最少的路劲 */ # include <iostream> # include <numeric> # include <algorithm> # include <functional> # include <list> # include <map> # include <set> # include <stack> # include <deque> # include <queue> # include <vector> # include <ctime> # include <cstdlib> # include <cmath> # include <string> using namespace std; int main(int argc, char *argv[]) { int e[10][10], dis[10], book[10], n, m; const int maxn = 0x3f3f3f3f; //读入n和m, n表示顶点数, m表示边的条数。 scanf("%d %d", &n, &m); //初始化 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) { e[i][j] = 0; } else { e[i][j] = maxn; } } } //读入边 for(int i = 1; i <= m; i++) { int t1, t2, t3; cin >> t1 >> t2 >> t3; e[t1][t2] = t3; } //初始化dis数组, 这里是1号顶点到其余各个顶点的初始路程 for(int i = 1; i <= n; i++) { dis[i] = e[1][i]; } //book数组初始化 memset(book, 0, sizeof(book)); book[1] = 1; //迪杰斯特拉算法核心语句 //大循环意思是执行n-1找最短距离 for(int i = 1; i <= n - 1; i++) { //找到离1号顶点最近的顶点 int min = maxn; int flag; for(int j = 1; j <= n; j++) { if(!book[j] && dis[j] < min) { //记录最小值和下标 min = dis[j]; flag = j; } } book[flag] = 1; //找到当前最短顶点的下标然后进行松弛。 for(int v = 1; v <= n; v++) { if(e[flag][v] < maxn) { if(dis[v] > dis[flag] + e[flag][v]) { dis[v] = dis[flag] + e[flag][v]; } } } } for(int i = 1; i <= n; i++) { if(i == n) { cout << dis[i] << endl; } else { cout << dis[i] << " "; } } return 0; } /* 输入数据 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4 */ -+
迪杰斯特拉
猜你喜欢
转载自blog.csdn.net/I_O_fly/article/details/80053989
今日推荐
周排行