Dijkstra Floyd

本文详细介绍了Dijkstra算法的实现过程,并指出了一个常见错误并进行修正。通过实例演示了算法的应用,确保路径更新过程的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Dijkstra(int cost[][MAX], int lowcost[MAX], 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++)// 下面的加法可能导致溢出,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;
		}
}











typedef struct          
{        
    char vertex[VertexNum];                                //顶点表         
    int edges[VertexNum][VertexNum];                       //邻接矩阵,可看做边表         
    int n,e;                                               //图中当前的顶点数和边数         
}MGraph; 


void Floyd(MGraph g)
{
   int A[MAXV][MAXV];
   int path[MAXV][MAXV];
   int i,j,k,n=g.n;
   for(i=0;i<n;i++)
      for(j=0;j<n;j++)
      {   
             A[i][j]=g.edges[i][j];
            path[i][j]=-1;
       }
   for(k=0;k<n;k++)
   { 
        for(i=0;i<n;i++)
           for(j=0;j<n;j++)
               if(A[i][j]>(A[i][k]+A[k][j]))
               {
                     A[i][j]=A[i][k]+A[k][j];
                     path[i][j]=k;
                } 
     } 
}

Give a wrong dijstrala here, the processing of updating path is wrong:

 

const int INF = 0x3fffffff;
void dijstrala(const vector<vector<int>>& cost, int beg, vector<int>& lowcost) {
  int n = cost.size(), i, j, pre, min, minIndex;
  vector<int> vis(n, 0), path(n);
  for (i = 0; i < n; ++i) 
    lowcost[i] = cost[beg][i];
  vis[beg] = 1, pre = beg, path[beg] = -1;
  for (i = 1; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (vis[j] == 0 && lowcost[pre] + cost[pre][j] < lowcost[j])
        lowcost[j] = lowcost[pre] + cost[pre][j]; 
    }
    min = INF, minIndex = pre;
    for (j = 0; j < n; ++j)
      if (vis[j] == 0 && lowcost[j] < min) {
        min = lowcost[j];
        minIndex = j;
      }
      path[minIndex] = pre, vis[minIndex] = 1, pre = minIndex; 
  }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值