最短路问题

单元最短路(Single-Soure Shortest Paths)SSSP

无权图,路径是1;

采用深度优先搜索,定义dist数字存储路径长度,,之后进行深度优先搜索。
利用dist存储路径长度还有一个好处就是不用建立visited数组进行存储是否遍历过。dist数组初始化-1;
伪码描述:

void Unweight(int S)
{
建立队列,S入队;
只要队列不空,所有和S相连的W,只要W的dist是-1(代表没有被访问过),dist[W]=dist[S]+1;
}

具体代码:
void Unweight(int S)
{
	int W;
	queue<int>Q;
	Q.push(S);
	while(!Q.empty())
	{
		W=Q.front();
		Q.pop();
		for(int i=0;i<MAX;i++)
		{
			if(G[i][W]||G[W][i])
			{
				if(dist[i]==-1)
				{
					dist[i]=dist[W]+1;
					Q.push(i);
				}
			}
		}	
	}
}

2.有权图的最短路问题:
Dijkstra算法:

Diljstra算法适用于边权为正的情况,原理描述:

令S={源点s+已经确定了最短路径的顶点vi}
对任一未收录的顶点v定义dist[v],定义dist[v]为s到v的最短路径长度,但该路径仅仅经过S中的顶点。即路径{s->(vi属于S)->v

的最小长度。
经过多次迭代,S中的元素将收录所有元素。

每次从未收录的顶点中选一个dist最小的收录(贪心)
增加一个v进入S,可能影响另一个w的dist值,dist[w]=min(dist[w],dist[v]+<v,w>权重}
这个需要初始化,将源点初始化为0,其余相邻初始化为权重。

具体:伪代码描述:
清除所有点的标号

设d[0]=0,其他d[i]=INF,循环n次
{

  在所有未标记的点中,选出d值最小的结点x,给x标记,对于从x出发的所有边(x,y),更新d[y]=min(d[y],d[x]+G[x][y])
}
void Dijkstra(int S)
{
	memset(visied,false,sizeof(visited));
	for(int i=0;i<n;i++)  dist[i]=(i==S?0:INF);
	for(int i=0;i<n;i++)
	{
		int x,m=INF;
		for(int y=0;y<n;y++) if(!visited[y]&&d[y]<=m) m=dist[x=y];
		v[x]=true;
		for(int y=0;y<n;y++)  d[y]=min(d[y],d[x]+G[x][y]);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值