Dijkstra模板

来源:互联网 发布:知乎电脑客户端 编辑:程序博客网 时间:2024/06/10 01:25
Dijkstra算法是一个计算单源最短路径的算法,但是注意图中不能出现负权,这是一个函数不含参的模板
#define INF 100000000#define n 1000int map[1100][1100],dis[1100],flag[1100];void dijkstra(){    int i,j,k,min;    memset(flag,0,sizeof(flag));    flag[0]=1;    for(i=0;i<=n;i++)    {        dis[i]=map[0][i];    }    for(i=1;i<n;i++)    {        min=INF;        for(j=1;j<=n;j++)        {            if(!flag[j]&&dis[j]<min)            {                min=dis[j];                k=j;            }        }        flag[k]=1;        for(j=1;j<=n;j++)        {            if(!flag[j]&&dis[j]>dis[k]+map[k][j])                dis[j]=dis[k]+map[k][j];        }    }}

这是一个含参,参数为源点的模板:

#define inf 0x3f3f3f3f    const int N = 505;  int map[N][N];   //利用邻接矩阵保存图  int dis[N];      //最短路值  int vis[N];      //标记数组  int num[N];     //路径个数  int maxx[N];    //最短路径最大的权值和  int a[N];       //每个点的权值  int pre[N];     //保存路径,记录前驱  void dij(int start){      int i;      memset(vis,0,sizeof(vis));      for(i=0;i<n;i++){          if(i==start) {              dis[i]=0;              maxx[i]=a[i];          }          else {              dis[i]=map[start][i];              maxx[i]=a[start]+a[i];   //重要  maxx初始化          }                    if(i!=start&&map[start][i]!=inf)              pre[i]=start;          else              pre[i]=-1;      }      vis[start]=1;      for(i=0;i<n;i++){          int t=inf,j,k;          for(j=0;j<n;j++){              if(!vis[j]&&t>dis[j]){                  t=dis[j];                  k=j;              }          }          if(t==inf){              break;    //不连通          }          vis[k]=1;          for(j=0;j<n;j++){              if(!vis[j]){                  if(dis[j]>dis[k]+map[k][j]){                      dis[j]=dis[k]+map[k][j];                      maxx[j]=maxx[k]+a[j];                      num[j]=num[k];                      pre[j]=k;                  }                  else if(dis[j]==dis[k]+map[k][j]){                      num[j]=num[j]+num[k];                      if(maxx[j]<maxx[k]+a[j]){                          maxx[j]=maxx[k]+a[j];                          pre[j]=k;                      }                      //maxx[j]=max(maxx[j],maxx[k]+a[j]);                  }              }          }      }  }  


0 0