3月2-第八次机试课记录

图论

  • dij使用地图是带权图

    • 记得初始化为INF
    • 无边的权值是INF,不是0,并且这个INF别用INT_MAX这个宏,会导致出现一些问题,比如dij更新路径的时候,INT_MAX + 1会变成负值,出错,自己定义一个比较大的数就行了
    const int INF = 1e9 + 7;

思路与总结

  • 与图相关的算法
    • dfs/bfs
    • 最小生成树(prim + krusk)
    • 最短路径(dij + floyd)
    • 并查集
    • 拓扑排序
  • 注意初始化的值,不一定全是-1和0,比如dij的地图无法联通是INF
  • 无向图初始化要两次
  • 不仅是状态数组需要重新更新,地图在多组数据也要clear

题号

  • PIPIOJ 1382: PIPI染色

  • PIPIOJ 1010: 好坑的电子地图

  • PIPIOJ 1117: 吝啬的PIPI

  • PIPIOJ 1384: PIPI的飞行路线

  • PIPIOJ 1182: 公交车站

  • PIPIOJ 1115: PIPI的聚会

  • PIPIOJ 1202: 侦探PIPI

  • PIPIOJ 1383: 院长PIPI

  • PIPIOJ 1183: 信使PIPI

  • PIPIOJ 1122: PIPI的比赛

    扫描二维码关注公众号,回复: 9538505 查看本文章

分析

  • 1010

    • 对地图的预处理,将不同奇数偶数的区别直接计算在地图上,ok了
  • 1117

    • 同样要对地图预处理
    • 同时这题在dij的时候搜索与更新路径是不一样的
      • 搜索是找最大保留路径
      • 更新是根据乘法更新路径信息
    • 这题还有个坑在与无法转账不是无法访问到这个点,而是最后的保留率为0,因为还可以包含给的数据直接收手续费全收取了
  • 1384

    • 使用优化的dij,主要在于使用矩阵的dij每次找最小点需要on的复杂度,现在使用优先队列,可以优化查询时间

    • 其次这题本来是打算使用dfs计算所有到达终点的路径,然后登记路径上可能的最大免费路径,但是答案给出的方法更加巧妙,使用两次dij,一次从起点到各个点,一次从终点到各个点,然后枚举免费路径,利用上面两个数组来维护最小开销

      //使用优先队列优化的dij
      struct Node{
          int t;//对应点
          int cost;//对应点的开销,不一定是最小
          bool operator < (const Node &node) const{
              return cost > node.cost;//定义优先级
          }
      }
      
      const int INF = 1e9;
      
      vector<Node> mp[N];//连接表
      int dist[N];//维护各个点的最小距离
      
      void dij(int s){
          for(int i = 1; i <= n; i ++)
              dist[i] = INF;
          dist[s] = 0;
          priority_queue<Node> Q;
          Q.push({s, 0});
          while(! Q.empty()){
              Node now = Q.top();Q.pop();
      
              if(now.cost > dist[now.t])continue;//比最小的距离都大,没必要访问
              //就是正常的更新路径
              for(int i = 0; i < mp[now.t].size(); i ++){
                  Node next = mp[now.t][i];
                  if(dist[next.t] > now.cost + next.cost){//注意是now.cost不是dist[now.t]
                      dist[next.t] = now.cost + next.cost;
                      Q.push({next.t, dist[next.t]});
                  }
              }
          }
      }
      
      
  • 1115

    • 这题使用并查集,注意数据n和N是不一样的,朋友的下标并不在n之中,n只是查询的次数

猜你喜欢

转载自www.cnblogs.com/faberry/p/12399083.html