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的比赛

分析

  • 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只是查询的次数

原文地址:https://www.cnblogs.com/faberry/p/12399083.html

时间: 2024-08-15 06:03:57

3月2-第八次机试课记录的相关文章

清华大学软件2014机试

清华大学软件2014机试 By 钟桓 9月 24 2014 更新日期:9月 24 2014 今天刚刚机试完,乘者还没忘记,把自己知道的记下来,也算是泽被后来人吧~~~ 这次的机试题,相对来说,会更简单一点,总共3题,时间是3小时. 1 超级幸运数 题目大致描述: 一个数字,若是只含有1和4,这个数字就是幸运数,例如,14,114.但是514这样的就不是了,因为含有其它数字. 若这个幸运数字中,1和4的数量相同,那么就是超级幸运数,例如14,1144,41等等. 题目要求,输入一个n,n的范围是[

2014年6月6日--华为机试

准备了还有一段时间了,结果还是悲剧了,主要准备的是算法,结果华为机试更看重字符串的操作,这一块正好是自己的弱项,哎.不过还有时间,这几个月多刷刷题,多锻炼锻炼,加油吧. 机试一共考了三道题,两道简单点的,一道难题,难题考得是状态机,不知道是什么东西╮(╯▽╰)╭,简单的两题做的也不好,回来在重新做一下.   1.倒置英文句子中单词的字母顺序. hello, I am good.  ->  olleh, I ma doog. 这题其实不难,当时脑子有点纠结符号,所以没做出来,还有一点客观原因,平时

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

清华大学软件2016机试

机试完几天了,两个月的准备就是为了这三小时的三道题,趁着没忘记,把题目贡献出来,也算是继承学长的光荣传统,泽被后人吧! 1.大数乘法 先输入一个数字m,表示后面将输入m个数,接着输入m个0到9的数,以空格隔开(至少有一个不为0),这些数可构成一个十进制数a, a的三次方为数b, 求b的各个位的数字,输出时以空格隔开,不要输出多余的空格. 输入示例: 4 1 2 3 4 输出示例: 1 8 7 9 0 8 0 9 0 4 思路:题目不难,用大数乘法做之  2.最短时间 给一个有向图,图的各个顶点的

2014华为机试西安地区A组试题

2014华为机试西安地区A组试题 题目一.分苹果 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放. 1<=M<=10,1<=N<=10 例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8 题目分析: 这道题类似于整数划分的题目,这是很早的一道ACM的题目,主要思路就是考递归. ①当苹果数目或者篮子数目为1时候,就只有一种可能 ②当苹果数目小于篮子数目的时候,按照苹果数目来分配 ③当苹果数目大于篮子数目的时候,空一个盘子 + 先每个盘子放

[华为机试]判断身份证信息是否合法

代码为; #include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> int main() { std::vector<std::string> identity; std::string temp; std::ifstream file("in.txt"); while(getline(

Hua Wei 机试题目

一.身份证号码验证 题目描述: 我国公民的身份证号码特点如下:1. 长度为18位:2. 第1-17位只能为数字:3. 第18位可以是数字或者小写英文字母x.4. 身份证号码的第7~14位表示持有人生日的年.月.日信息.例如:511 002 1988 08 08 0111或51100219880808011x.请实现身份证号码合法性判断的函数.除满足以上要求外,需要对持有人生日的年.月.日信息进行校验.年份大于等于1900年,小于等于2100年.需要考虑闰年.大小月的情况.所谓闰年,能被4整除且不

华为OJ机试训练(一)

题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. 输出: /** * 华为机试训练1: 通过输入英文句子,将每一个单词反过来.标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? * Hello, I need an apple. * * @author snail * */ public class Mai

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include