⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dijkstra.cpp

📁 Dijkstra算法的实现
💻 CPP
字号:
// Dijkstra.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Dijkstra.h"
#include "NodeArray.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;
const int maxint = 65535;//定义一个最大的数值,作为不相连的两个节点的代价权值

using namespace std;

void Dijkstra(int n,int v,int dist[],int prev[],int **cost);

//展示最佳路径函数
void ShowPath(int n,int v,int u,int *dist,int *prev)
{	
	int j = 0;
	int w = u;
	int count = 0;
	int *way ;
// 	way=(int *)malloc(sizeof(int)*(n+1));
	way = new int[sizeof(int)*(n+1)];
	//回溯路径
	while (w != v)
	{
		count++;
		way[count] = prev[w];
		w = prev[w];
	}
	//输出路径
	printf("the best path is:\n");
	for (j = count; j >= 1; j--)
	{
		printf("%d -> ",way[j]);
	}
	printf("%d\n",u);
	
	delete[] way;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		// TODO: code your application's behavior here.
// 		CNodeArray myNodeArray;
// 		myNodeArray.AddNode("192.168.0.221");
// 		myNodeArray.AddNode("192.168.0.206");
// 		myNodeArray.DelNode(221);
		int i,j,t;
		int n,v;
		
		int **cost;//代价矩阵
		int *dist;//最短路径代价
		int *prev;//前一跳节点空间
		
		
		printf("please input the node number: ");
		scanf("%d",&n);
		printf("please input the cost status:\n");
		
// 		cost=(int **)malloc(sizeof(int)*(n+1));
// 		
// 		for (i = 1; i <= n; i++)
// 		{
// 			cost[i]=(int *)malloc(sizeof(int)*(n+1));
// 		}
		cost = new int*[sizeof(int)*(n+1)];
		for(i=1;i<=n;i++)
		{
			cost[i] = new int[sizeof(int)*(n+1)];
		}

		//输入代价矩阵
		for (j = 1; j <= n; j++)
		{
			for (t = 1; t <= n; t++)
			{
				scanf("%d",&cost[j][t]);
			}
		}
		
// 		dist = (int *)malloc(sizeof(int)*n);
// 		prev = (int *)malloc(sizeof(int)*n);
		dist = new int[sizeof(int)*n];
		prev = new int[sizeof(int)*n];
		
		
		printf("please input the source node: ");
		scanf("%d",&v);
		//调用dijkstra算法  
		Dijkstra(n, v, dist, prev, cost);
		printf("*****************************\n");
		printf("have confirm the best path\n");
		printf("*****************************\n");
		for(i = 1; i <= n ; i++)
		{
			if(i!=v)
			{
				printf("the distance cost  from node %d to node %d is %d\n",v,i,dist[i]);
				printf("the pre-node of node %d is node %d \n",i,prev[i]);
				ShowPath(n,v,i, dist, prev);
			}
		}

		delete []dist;
		delete []prev;
		for(i=1;i<=n;i++)
			delete[] cost[i];
		delete[] cost;
	}

	return nRetCode;
}

void Dijkstra(int n,int v,int dist[],int prev[],int **cost)
{
	int i;
	int j;

    int *s ;//定义具有最短路径的节点子集s
	s = new int[sizeof(int)*n];
// 	s = (int *)malloc(sizeof(int) * n);
    //初始化最小路径代价和前一跳节点值
    for (i = 1; i <= n; i++)
    {
        dist[i] = cost[v][i];
        s[i] = 0;
        if (dist[i] == maxint)
        {
            prev[i] = 0;
        }
        else
        {
            prev[i] = v;
        }
    }
    dist[v] = 0;
    s[v] = 1;//源节点作为最初的s子集
	
	
    for (i = 1; i < n; i++)
    {
        int temp = maxint;
        int u = v;
        //加入具有最小代价的邻居节点到s子集
        for (j = 1; j <= n; j++)
        {
            if ((!s[j]) && (dist[j] < temp))
            {
                u = j;
                temp = dist[j];
            }
        }
        s[u] = 1;
        //计算加入新的节点后,更新路径使得其产生代价最短
        for (j = 1; j <= n; j++)
        {
            if ((!s[j]) && (cost[u][j] < maxint))
            {
                int newdist = dist[u] + cost[u][j];
                if (newdist < dist[j])
                {
                    dist[j] = newdist;
                    prev[j] = u;
                }
            }
        }
    }

	delete []s;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -