zoukankan      html  css  js  c++  java
  • SPFA

    求最短路径 SPFA

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring> 
     4 using namespace std;
     5 
     6 const int MAXN=1001;
     7 const int INF=999999;
     8 
     9 int map[MAXN][MAXN];//记录权值 
    10 int path[MAXN];//记录路径 
    11 int dis[MAXN];//记录最短值 
    12 int team[MAXN];//队列 
    13 bool visit[MAXN];//是否在队列中 
    14 int n,m,u,v,len,a,e;
    15 
    16 void sc(int u)//求最短路径 
    17 {
    18     int head=0,tail=1,p;
    19     team[head]=u;//队列的第一个为起点 
    20     path[u]=u;//路径为起点 
    21     visit[u]=true;//标记为已在队列中 
    22     dis[u]=0;//起点的权值为0 
    23     while(head<tail)
    24     {
    25         p=team[head];
    26         for(int i=1;i<=n;i++)
    27         {
    28             if(dis[i]>dis[p]+map[p][i])//松弛
    29             {
    30                 dis[i]=dis[p]+map[p][i]; 
    31                 path[i]=p;
    32                 if(!visit[i])//如果不在队列中,重新入队 
    33                 {
    34                     team[tail++]=i;
    35                     visit[i]=true;//标记已为在队列中 
    36                 }
    37             }
    38         }
    39         visit[p]=false;//将p标记为没在队列中 
    40         head++;//head后移,head所指向的元素依次出对 
    41     }
    42     cout<<dis[e]<<endl;//输出最短路径的长度 
    43 }
    44 
    45 void out(int b,int o)//输出最短路径的路径 
    46 {
    47     int que[MAXN];//记录最短路径的路径
    48     int tot=1;
    49     que[tot]=o;//第一个为起点 
    50     tot++;
    51     int temp=path[o];
    52     while(temp!=b)//将路径依次记录在que数组中 
    53     {
    54         que[tot]=temp; 
    55         tot++;
    56         temp=path[temp];
    57     }
    58     que[tot]=b;
    59     for(int i=tot;i>=1;i--)//输出路径 
    60     {
    61         if(i!=1)//避免最后一个路径带有--> 
    62         cout<<que[i]<<"-->";
    63         else 
    64         cout<<que[i];
    65     }
    66 }
    67 
    68 int  main()
    69 {
    70     cin>>n>>m;
    71     for(int i=1;i<=n;i++)//初始化 
    72       for(int j=1;j<=n;j++)
    73         map[i][j]=INF;
    74     for(int i=1;i<=m;i++){
    75         cin>>u>>v>>len;
    76         map[u][v]=len;
    77     }
    78     for(int i=1;i<=n;i++)
    79     dis[i]=INF;
    80     memset(visit,false,sizeof(visit));
    81     memset(team,0,sizeof(team));
    82     cin>>a>>e;//输入查找的起点和终点 
    83     sc(a);
    84     out(a,e);
    85     return 0;
    86 }
  • 相关阅读:
    人员安排问题--搜索算法的剪支方法应用
    深度优先搜索与广度有限搜索的比较
    任务调度问题-使用拟阵进行解决
    无向图的最小生成森林的拟阵解法
    拟阵的最优子集问题的贪心算法
    中国大学MOOC —— 学习笔记(三)
    中国大学MOOC —— 学习笔记(二)
    中国大学MOOC —— 学习笔记(一)
    Python DayDayUp —— 小项目实现(二)
    Python DayDayUp —— shelve模块
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6689792.html
Copyright © 2011-2022 走看看