迪杰斯特拉算法总结

迪杰斯特拉算法总结

背景

(图片来自b站王道数据考研)
图片1

  1. 布尔值类型的final[]是为了标记该点是否被访问过。
  2. dist[]数组记录从起点到该点的最短距离。
  3. path[]数组是为存储到达该点距离最短时的上一个点。

主要代码

int inf=0x3f3f3f3f;//无穷大
bool final[100];
int dist[100];
int path[100];
int grap[100][100];//地图
void dijksta(int v0)
{
//初始化起点的值
final[v0]=1;
dist[v0]=inf;
path[v0]=-1;
for(int i=2;i<=n;++i)
{
  final[i]=0;
  dist[i]=grap[vo][i];
  path[i]=0;
 }
  for(int i=1;i<n;++i)
  {
     int temp,Min=inf;
     for(int j=1;j<=n;++j)
    {
     if(!final[j]&&dist[j]<Min)
      {
          temp=j;
          Min=dist[temp];
          }
     }
     fianl[temp]=1;//标记已经走过了
     for(int j=1;j<=n;++j)
     if(!final[j]&&dist[temp]+grap[temp][j]<dist[j])
     {
     dist[j]=dist[temp]+grap[temp][j];
     path[j]=temp;
     }
   }
}

构造图代码

typedef struct//结构体
{
   int ve[100];
   int ar[100][100];
   int venum,arnum;
   }Grap;
   //判断出顶点在二维数组中的位置
   int LocatVe(Grap *g,int v)
   {
        int i=1;
        for(;i<=g.venum;++i)
        {
           if(v==g->ve[i])
           break;
        }
        if(i>g->venum)//没找到
          return -1;
      return i;//返回该顶点的位置
   }
   void CreateG(Grap *g)
   {
      for(int i=1;i<=g->venum;++i)
        g->ve[i]=i;
      for(int i=1;i<=g->venum;++i)
      {
         for(int j=1;i<=g->venum;++j)
         {
           g->ar[i][j]=inf;
         }
      }
      for(int i=0;i<g->arnum;++i)
      {
          int v1,v2,w;
            cin>>v1>>v2>>w;
            int n=LocatVe(g,v1);
            int m=LocatVe(g,v2);
            if(n!=-1&&m!=-1)
            g->ar[n][m]=g->ar[m][n]=w;
      }
   }
int inf=0x3f3f3f3f;
int grap[100][100];
int v1,v2,w;
for(int i=1;i<=n;++i)//初始化
  for(int j=1;j<=n;++j)
     grap[i][j]=inf;
 for(int i=1;i<=t;++i)//改变一些权
   {
       cin>>v1>>v2>>w;
       if(grap[v1][v2]>w)//选择最小的记录在地图中
       {
          grap[v1][v2]=grap[v2][v1]=w;
       }
   }
        
//只建立存在的顶点和边
# define inf 0x3f3f3f3f
struct edge
{
int v;//顶点
int next;
int w;//权值
};
edge arc[100];
int head[100];
int d[100];
int dist[100];
bool vis[100];
bool hash[100];
int cnt;
void Create(int v1,int v2,int w)
{
    arc[cnt].v=v2;
    arc[cnt].w=w;
    arc[cnt].next=head[v1];
    head[v1]=cnt++;
}
void Init()//初始化
{ 
   cnt=0;
    memset(head,-1,sizeof head);
    memset(d,inf,sizeof d);
    memset(vis,0,sizeof vis);
    memset(hash,0,sizeof hesh);
}

解决少部分的最短路问题,题目还是会有变化,要根据题目的变化而选择合适的算法解题。
目前就想到这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值