3月2-第八次机试课记录
Posted faberry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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只是查询的次数
以上是关于3月2-第八次机试课记录的主要内容,如果未能解决你的问题,请参考以下文章