• 总结 搜索和最短路径问题


    • DFS
    • BFS
    • Dijkstra
    • Spfa
    • Floyd

     ① DFS:

     1 #include <iostream>
     2 #include <unordered_map>
     3 #include <algorithm>
     4 #include <vector>
     5 #include <cmath>
     6 using namespace std;
     7 const int maxn = 410;
     8 
     9 int n,k,p;
    10 int list[maxn];
    11 vector<int> path,tmppath;
    12 int maxSum=0;
    13 int cnt=0;
    14 int ptr=0;
    15 
    16 bool cmp(int a,int b){
    17     return a>b;
    18 }
    19 
    20 void dfs(int v,int value,int sum,int len){
    21     tmppath.push_back(v);
    22     if(len==k){
    23         if(len==k&&value==n&&sum>=maxSum){
    24             path=tmppath;
    25             maxSum=sum;
    26         }
    27         tmppath.pop_back();
    28         return;
    29     }
    30     for(int i=v;i<=ptr;i++){
    31         if(value+list[i]<=n)
    32             dfs(i,value+list[i],sum+i,len+1);
    33     }
    34     tmppath.pop_back();
    35     return;
    36 }
    37 
    38 int main(){
    39     scanf("%d%d%d",&n,&k,&p);
    40     
    41     for(int i=0;i<maxn;i++,ptr++){
    42         list[i]=pow(i, p);
    43         if(list[i]>=n) break;
    44     }
    45     /*printf("%d
    ",ptr);
    46     for(int i=0;i<maxn;i++){
    47         printf("%d ",list[i]);
    48     }*/
    49     for(int i=1;i<=ptr;i++){
    50         //printf("%d ",i);
    51         dfs(i,list[i],i,1);
    52     }
    53     if(path.size()==0){
    54         printf("Impossible");
    55         return 0;
    56     }
    57     printf("%d = ",n);
    58     sort(path.begin(), path.end(),cmp);
    59     for(int i=0;i<path.size();i++){
    60         if(i!=0) printf(" + ");
    61         printf("%d^%d",path[i],p);
    62     }
    63 }
    View Code

    ② BFS

    ③ Dijkstra

    • 有权图的最短路
    • 不能处理负边
    • 可以搭配dfs处理复杂的条件(1018Public Bike Management

    ④ Spfa  万能

    • 有权图最短路
    • 可以处理负边
    • 可以判别负环
     1 void  spfa(s);  //求单源点s到其它各顶点的最短距离
     2     for i=1 to n do { dis[i]=∞; vis[i]=false; }   //初始化每点到s的距离,不在队列
     3     dis[s]=0;  //将dis[源点]设为0
     4     vis[s]=true; //源点s入队列
     5     head=0; tail=1; q[tail]=s; //源点s入队, 头尾指针赋初值
     6     while head<tail do {
     7        head+1;  //队首出队
     8        v=q[head];  //队首结点v
     9        vis[v]=false;  //释放对v的标记,可以重新入队
    10        for 每条边(v,i)  //对于与队首v相连的每一条边
    11         if (dis[i]>dis[v]+a[v][i])  //如果不满足三角形性质
    12          dis[i] = dis[v] + a[v][i]   //松弛dis[i]
    13         if (vis[i]=false) {tail+1; q[tail]=i; vis[i]=true;} //不在队列,则加入队列
    14     } 
    15 
    16 //https://blog.csdn.net/xunalove/article/details/70045815

    ⑤ Floyd

    • 多源最短路
  • 相关阅读:
    bfs入门 (HDU
    Codeforces Round #570 (Div. 3)B
    nyoj 277-车牌号 (map, pair, iterator)
    nyoj 276-比较字母大小 (顺序比较, 逆序输出)
    nyoj 275-队花的烦恼一 (stack, push, pop)
    nyoj 274-正三角形的外接圆面积 (R = PI * a * a / 3)
    nyoj 273-字母小游戏 (getline(cin, string))
    nyoj 268-荷兰国旗问题 (count)
    nyoj 266-字符串逆序输出 (isdigit(), geline(cin, my_string))
    nyoj 264-国王的魔镜 (string[-1:-int(str_len/2+1):-1])
  • 原文地址:https://www.cnblogs.com/lokwongho/p/10031575.html
Copyright © 2020-2023  润新知