算法导论 · 贪心策略 · dijkstra算法

  • 算法说明
    迪杰斯特拉算法是要来求单源路径最短算法,与普里姆算法很相近,唯一的区别,这里刷新的是源点与其他点的距离
  • 源代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define maxn 1000 + 1
#define inf 1 << 29

struct node {
	int b, c;
	node(int bb, int cc) {
		b = bb;
		c = cc;
	}
};

int n, m; //顶点和边数 
vector<node> vt[maxn]; //邻接表 
int dis[maxn]; //起点到达各个点的最短路径长 
bool vis[maxn]; //是否被访问

void dijkstra(int u) { //从顶点u开始出发
	fill(dis, dis + n, inf);
	fill(vis, vis + n, false);
		 
	dis[u] = 0; 
	for(int k = 0; k < vt[u].size(); k++) { //初始化距离 
		int b = vt[u][k].b;
		if(vis[b] == false && vt[u][k].c < dis[b]) {
			dis[b] = vt[u][k].c;
		}
	}
	
	for(int i = 0; i < n; i++) {
		int v = -1, min = inf;
		for(int j = 0; j < n; j++) {
			if(vis[j] == false && dis[j] < min) { //找到离集合最近的点 
//				printf("herehere\n");
				v = j;
				min = dis[j];
			}
		} 
		
		if(v == -1) {
//			printf("-1-1-1-1\n");
			return;
		}
		vis[v] = true;
		
		for(int k = 0; k < vt[v].size(); k++) { //b作为中介点,刷新距离 
			int b = vt[v][k].b;
			if(vis[b] == false && vt[v][k].c + dis[v] < dis[b]) {
				dis[b] = vt[v][k].c + dis[v];
			}
		}
	} 	
}
int main() {
	freopen("dijkstraAlgorihtm.txt", "r", stdin);
	scanf("%d%d", &n, &m);
	while(m--) {
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		vt[a].push_back(node(b, c));
	}
	
	dijkstra(0); //可以从任意一点出发 
	
	for(int i = 0; i < n; i++) {
		printf("%d  ", dis[i]);
	}

	return 0;
}
  • 输入数据
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97565969