# 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> # include <cstring> # include <iomanip> # include <queue> using namespace std; int const maxn = 10; int e[maxn][maxn], dis[10], book[10]; const int INF = 0x3f3f3f3f; // 用inf存储一个我们认为的正无穷值 void init() { for(int i = 0; i < maxn; i++) { for(int j = 0; j < maxn; j++) { if(i == j) e[i][j] = 0; else e[i][j] = INF; } } } int main(int argc, char *argv[]) { //初始化 int n, m; scanf("%d%d", &n, &m);//读入n和m, n表示顶点个数, m表示边的条数 init(); //读入边 for(int i = 1; i <= m; i++) { int x, y, t; scanf("%d %d %d", &x, &y, &t); e[x][y] = t; } //初始化book,dis数组 memset(book, 0, sizeof(book)); memset(dis, 0, sizeof(dis)); //初始化dis数组, 1号顶点到各个顶点的路程 for(int i = 1; i <= n; i++) { dis[i] = e[1][i]; } //标志着1号顶点已经被用 book[1] = 1; int temp; //迪杰斯特拉 for(int i = 1; i <= n-1; i++) { int min = INF; for(int j = 1; j <= n; j++) { //判断这个点用没用过并且要这个距离小于最小值才更新数据 if(book[j] == 0 && dis[j] < min) { //dis[j] == e[1][j]源点1到自己的最短路劲 min = dis[j]; temp = j;//维护一个temp记录最小值的下标 } } book[temp] = 1;//标记着这个边已经用过 //选择一个离源点s最近的顶点temp, d[temp]最小,如果存在一条从temp到k的边,然后根据这个边进行边的松弛,如果这条边加进去更小就加进去 //dis[temp] + e[temp][k]; //dis[temp]表示是从1到temp的距离 for(int k = 1; k <= n; k++) { if(e[temp][k] < INF) { if(dis[k] > dis[temp] + e[temp][k]) { dis[k] = dis[temp] + e[temp][k]; } } } } //输出单源最短路劲1到各个顶点的最短距离 for(int i = 1; i <= n; i++) { printf("%d ", dis[i]); } printf("\n"); 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 reuslt:0 1 8 4 13 17
迪杰斯特拉(用邻接矩阵适用于稠密图)
猜你喜欢
转载自blog.csdn.net/i_o_fly/article/details/80412690
今日推荐
周排行