Dijkstra朴素模版(非优先队列优化)

const int INF = 0x3fffffff;
const int V = 200;
int dijkstra(int map[][V],int start,int end,int n) //map为临界矩阵,n为矩阵大小
{	
	int final[V],track[V],i,j,ant=n*n;
	memset(track,0,sizeof(track));
	for(i=1;i<=n;i++)
		final[i]=map[start][i]!=0?map[start][i]:INF;
	track[start]=1;
	while(ant--)
	{
		int judge=1,min=INF,getmin=start;
		for(i=1;i<=n;i++)
			judge*=track[i];
		if(judge) 	return final[end];
		for(i=1;i<=n;i++)
		{
			if( final[i] < min && final[i]!=INF && track[i]==0)
			{
				getmin = i;
				min = final[i];
			}
			final[i] = final[start]+(map[start][i]==0?INF:map[start][i]) < final[i] ? final[start]+(map[start][i]==0?INF:map[start][i]) : final[i];
		}
		track[getmin]=1;
		start = getmin;	
	}
	return -1;
}


上面的是自己写的朴素算法


#define INF 0x03F3F3F3F 
const int N; 
int path[N], vis[N]; 
void Dijkstra(int cost[][N], int lowcost[N], int n, int beg)
{ 
	int i, j, min; 
	memset(vis, 0, sizeof(vis)); 
	vis[beg] = 1; 
	for (i=0; i<n; i++)
	{ 
		lowcost[i] = cost[beg][i]; path[i] = beg; 
	} 
	lowcost[beg] = 0; 
	path[beg] = -1;     // 树根的标记 
	int pre = beg; 
	for (i=1; i<n; i++)
	{ 
		min = INF; 
		for (j=0; j<n; j++)                                                     
			pre[v] = u; return 1; 
		// 下面的加法可能导致溢出 ,INF不能取太大                              
		if (vis[j]==0 && lowcost[pre]+cost[pre][j]<lowcost[j])
		{                               
			lowcost[j] = lowcost[pre] + cost[pre][j]; 
			path[j] = pre;                                        
		}                                                          
		for (j=0; j<n; j++)                                                  
			if (vis[j] == 0 && lowcost[j] < min)
			{                       
				min = lowcost[j]; pre = j;                             
			}                                                         
		vis[pre] = 1;                                                         
	}                                                                       
}

上面是吉大大牛写的模版...欢迎大家取用

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值