2026/4/2 14:01:24
网站建设
项目流程
江西宗杰建设工程有限公司网站,wordpress设置了固定连接打不开,重庆企业网站建设联系电话,开通的网站怎样安装3650: 边反转的最小路径总成本思路#xff1a;Dijkstra 算法定义 g[i][j] 表示节点 i 到节点 j 这条边的边权。如果没有 i 到 j 的边#xff0c;则 g[i][j]∞。定义 dis[i] 表示起点 k 到节点 i 的最短路径长度#xff0c;一开始 dis[k]0#xff0c;其余 dis[i]∞ 表示尚未…3650: 边反转的最小路径总成本思路Dijkstra 算法定义 g[i][j] 表示节点 i 到节点 j 这条边的边权。如果没有 i 到 j 的边则 g[i][j]∞。定义 dis[i] 表示起点 k 到节点 i 的最短路径长度一开始 dis[k]0其余 dis[i]∞ 表示尚未计算出。根据 Dijkstra 算法同一个节点我们只会访问一次所以「最多可使用一次开关」这个约束是多余的我们只需把反向边的边权设置为 2wi 即可。答案为 0 到 n−1 的最短路长度。class Solution { public: int minCost(int n, vectorvectorint edges) { vectorvectorpairint,int g(n); //邻接表 for(auto e:edges){ int xe[0],ye[1],wte[2]; g[x].emplace_back(y,wt); g[y].emplace_back(x,wt*2); } vectorint dis(n,INT_MAX); //堆中保存 (起点到节点 x 的最短路长度节点 x) priority_queuepairint,int,vectorpairint,int,greater pq; //小根堆 dis[0]0; //起点到自己的距离是 0 pq.emplace(0,0); while(!pq.empty()){ auto [dis_x,x]pq.top(); pq.pop(); if(dis_xdis[x]) continue; //x之前出堆过 if(xn-1) return dis_x; //到达终点 for(auto [y,wt]:g[x]){ auto new_dis_ydis_xwt; if(new_dis_ydis[y]){ dis[y]new_dis_y; //更新 x 的邻居的最短路 //懒更新堆只插入数据不更新堆中数据 //相同节点可能有多个不同的 new_dis_y除了最小的 new_dis_y其余值都会触发上面的 continue pq.emplace(new_dis_y,y); } } } return -1; } };