dijkstra

背景:求最短路径,我的第一篇最短路径小试牛刀。

思维拓展:求最短路径有好几种算法,Dijkstra算法是没有负权路径求最短路径较好的算法之一,

                 思维过程:在S,V集合中,在V集合找出当前和S集合中最短距离的一点,并加入S集合中,迭代直到最后V集合为空。

代码大妈:

#include<iostream>
using namespace std;
int t[10][10];
int dist[10];
int flag[10];
#define  Infty  2100000000;
void fi(int n)
{
  for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
   t[i][j]=Infty;
      
}
void dijista(int n,int a,int b)
{
  for(int i=0;i<n;i++)
  {
     dist[i]=t[a][i];
     flag[i]=0;      
  }
  flag[a]=1;

  for(int i=0,k;i<n;i++)                   //n个顶点就找出n次目前最短的然后更新路径
  { 
    int min=Infty;
       for(int j=0;j<n;j++)
        {
          if(flag[j]!=1&&dist[j]<min)   //找出当前最短路径,加入S集合中
          { 
             k=j;
             min=dist[j];
         }       
       }
      printf("dist[k]:   %d   k:  %d\n ",dist[k],k);
      flag[k]=1;
      if(k==b)
      {
        printf("a->b:  %d\n ",dist[k]);
        goto END;       
      }

       for(int j=0;j<n;j++)                                     //用最新的S集合来更新于V集合中点的距离
          if(flag[j]!=1&&dist[j]>dist[k]+t[k][j])
            dist[j]=dist[k]+t[k][j];      
          
  }
  END:;   
}
int main()
{
int n,m,a,b,p,q,w;
while(scanf("%d%d%d%d",&n,&m,&a,&b))//n顶点,m边数,a起点,b终点

   fi(n);
   for(int i=0;i<m;i++)
   {
      scanf("%d%d%d",&p,&q,&w);
      t[p][q]=w;
      t[q][p]=w;
   }

   dijista(n,a,b);                                                              
}
system("pause");
return 0;}

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值