标签:区别 次数 并且 一个 接收 下标 并查集 push 现在
dij使用地图是带权图
const int INF = 1e9 + 7;
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
1117
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
标签:区别 次数 并且 一个 接收 下标 并查集 push 现在
原文地址:https://www.cnblogs.com/faberry/p/12399083.html