zoukankan      html  css  js  c++  java
  • 最短路径——Dijkstra(简易版)

    简易之处:顶点无序号,只能默认手动输入0,1,2...(没有灵活性)

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <malloc.h>
    
    using namespace std;
    
    const int VERTEX_NUM = 20;
    const int INFINITY = 0x3fffffff;
    
    bool vis[VERTEX_NUM];
    int dist[VERTEX_NUM];					// 源点到各点的距离 
    int pre[VERTEX_NUM];
    
    class Graph {
    public:
    	int vexNum;
    	int edgeNum;
    //	int vex[VERTEX_NUM];
    	int arc[VERTEX_NUM][VERTEX_NUM]; 
    };
    
    void createGraph(Graph &G)
    {
    	int i, j, w;
    	cout << "请输入无向图的顶点数和边数:";
    	cin >> G.vexNum >> G.edgeNum;				// 默认顶点序号为0 1 2 3... 
    	for (int i = 0; i != G.vexNum; ++i) {
    		for (int j = 0; j != G.vexNum; ++j) {
    			G.arc[i][j] = INFINITY;
    		}
    	} 
    	for (int k = 0; k != G.edgeNum; ++k) {
    		cout << "请输入边(vi, vj)的顶点i、j以及该边的权w:"; 
    		cin >> i >> j >> w;
    		G.arc[i][j] = w;
    		G.arc[j][i] = w;
    	}
    }
    
    // Dijkstra算法 
    void Dijkstra(Graph &G, int src)
    {
    	memset(vis, false, VERTEX_NUM);
    	memset(dist, INFINITY, VERTEX_NUM); 
    	vis[src] = true;
    	for (int i = 0; i != G.vexNum; ++i) {
    		dist[i] = G.arc[i][src];
    		pre[i] = src;
    	} 
    	int lowcost = INFINITY;
    	int lowcostIndex = src;
    	for (int cnt = 1; cnt != G.vexNum; ++cnt) {
    		lowcost = INFINITY;
    		for (int i = 0; i != G.vexNum; ++i) {
    			if (dist[i] < lowcost && !vis[i]) {
    				lowcost = dist[i];
    				lowcostIndex = i;
    			}
    		}
    		vis[lowcostIndex] = true;
    		for (int i = 0; i != G.vexNum; ++i) {
    			if (!vis[i] && G.arc[lowcostIndex][i] != INFINITY && lowcost + G.arc[lowcostIndex][i] < dist[i]) {
    				dist[i] = G.arc[lowcostIndex][i] + lowcost;
    				pre[i] = lowcostIndex;
    			}
    		}
    	} 
    }
    
    int main()
    {
    	Graph G;
    	createGraph(G);
    	cout << "请输入源点:";
    	int source;
    	cin >> source;
    	Dijkstra(G, source);
    	for (int i = 0; i != G.vexNum; ++i) {
    		if (i == source)	continue;
    		cout << "源点" << source << "到点" << i << "的距离为" << dist[i] << endl; 
    	}
    
    	return 0;
    } 
    

    测试方法及结果:

  • 相关阅读:
    【JVM】模板解释器--如何根据字节码生成汇编码?
    你会swap吗,按值传递还是按引用?
    你了解实时计算吗?
    Hadoop的Server及其线程模型分析
    机会
    storm如何分配任务和负载均衡?
    storm基础框架分析
    storm如何保证at least once语义?
    学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
    学习笔记:Twitter核心数据类库团队的Hadoop优化经验
  • 原文地址:https://www.cnblogs.com/xzxl/p/8651621.html
Copyright © 2011-2022 走看看