シングルソースの最短経路ダイクストラ

const int maxv=1000;
const int inf=1000000000;

 図1に示すように、隣接行列バージョンダイクストラ

const int maxv=1000;
const int inf=1000000000;

//1、邻接矩阵版Dijkstra
int G[maxv][maxv];
int n;
int d[maxv];  //起点到各点的最短路径长度 
bool vis[maxv]={false};

void Dijkstra(int n) 
{
	fill(d,d+maxv,inf);
	d[s]=0;
	
	for(int i=0;i<n;i++)  //n次,每次选出一个 
	{
		int u=-1;
		int min=inf;
		
		for(int j=0;j<n;j++)
		{
			if(vis[j]==false&&d[j]<min)
			{
				u=j;
				min=d[j];
			}
		}
		
		if(u==-1) return;
		vis[u]=true;  //选出来,然后,别忘记置为true 
		
		for(int v=0;v<n;v++)  //遍历其他点,看看能不能松弛 
		{
			if(vis[v]==false&&G[u][v]!=inf&&d[u]+G[u][v]<d[v])
			{
				d[v]=d[u]+d[u][v];
			}
		}
	}	
}

図2に示すように、隣接するテーブルのバージョンダイクストラ

struct Node
{
	int v;
	int dis;
};

vector<Node> adj[maxv];
int n;
int d[maxv];
bool vis[maxv]={false};

void Dijkstra(int s) 
{
	fill(d,d+maxv,inf);
	d[s]=0;
	for(int i=0;i<n;i++)
	{
		int u=-1;
		int min=inf;
		for(int j=0;j<n;j++)
		{
			if(vis[j]==false&&d[j]<min)
			{
				u=j;
				min=d[j];
			}
		}
		if(u==-1) return;
		vis[u]=true;
		
		//从u出发,看看能到达哪些边,看看能不能松弛 
		for(int j=0;j<adj[u].size();j++)   
		{
			int v=adj[u][j].v;
			if(vis[v]==false&&d[u]+adj[u][j].dis<d[v])
			{
				d[v]=d[u]+adj[u][j].dis;
			}
		}		
	}	
}

 

公開された180元の記事 ウォン称賛64 ビュー15万+

おすすめ

転載: blog.csdn.net/OpenStack_/article/details/104081894