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

📄 dijkstra.cpp

📁 计算机算法设计与分析(王晓东)教材上相关源程序代码。 包括分治法(4)
💻 CPP
字号:
#include<iostream.h>
#include<malloc.h>
#include<iomanip.h>

const int maxint=1000;

void dijstra(int n,int v,int*dist,int prev[],int **c)
{
	//单源点最短路径问题的dijstra算法

	int s[maxint];
	for(int i=0;i<n;i++)
	{
		dist[i]=c[v][i];
		s[i]=0;//标记是否为S集合中的点
	    if(dist[i]==maxint) prev[i]=0;
		else
			prev[i]=v;
	}

	dist[v]=0;s[v]=1;

	cout<<"初始:"<<endl;
	for(i=0;i<n;i++)
		cout<<setw(5)<<dist[i]<<"  ";
	cout<<endl;
	cout<<endl<<endl;


	for(i=0;i<n;i++)
	{
		cout<<"当前迭代次数"<<i+1<<endl;


		int temp=maxint;
		int u=v;

		for(int j=0;j<n;j++)
			if((!s[j])&&(dist[j]<temp))
			{
				u=j;temp=dist[j];
			}//endif endfor

		s[u]=1;//选取具有最小费用的点放入S中
		
		cout<<u+1<<"结点被放入S集合中"<<endl;


		//用u更新每个结点的dist
		for(j=0;j<n;j++)
		{
			if((!s[j])&&(c[u][j]<maxint))
			{
				int newdist=dist[u]+c[u][j];
				if(newdist<dist[j])
				{
					cout<<"结点"<<j+1<<"由"<<dist[j]<<"更新为"<<newdist<<endl;
					dist[j]=newdist;
					prev[j]=u;
				}//endif
			}//endif

		}//endfor


				
	for(j=0;j<n;j++)
		cout<<setw(5)<<dist[j]<<"  ";
	cout<<endl;
	cout<<endl<<endl;
	}//endfor




}//endldijstra


void main()
{
	int i,j;
	int **c,*dist,*prev;

	int n=5;

	c=(int **)malloc(sizeof(int *)*n);
	for(i=0;i<n;i++)
	{
		c[i]=(int*)malloc(sizeof(int)*n);
	}
	

	dist=(int*)malloc(sizeof(int)*n);
	prev=(int*)malloc(sizeof(int)*n);


	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			c[i][j]=maxint;
		}
		

	c[0][1]=10;
	c[0][3]=30;
	c[0][4]=100;
	c[1][2]=50;
	c[2][4]=10;
	c[3][2]=20;
	c[3][4]=60;


	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
		
			cout<<setw(5)<<c[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;


	dijstra(n,0,dist,prev,c);


	cout<<"result:"<<endl;
	for(i=0;i<n;i++)
		cout<<setw(5)<<dist[i]<<"  ";
	cout<<endl;
	

	delete[] prev;
	delete[] dist;

	for(i=0;i<n;i++)
		delete[] c[i];
	delete[] c;

}

⌨️ 快捷键说明

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