博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3946 Highway Project 贪心+最短路
阅读量:4594 次
发布时间:2019-06-09

本文共 1352 字,大约阅读时间需要 4 分钟。

题目链接:

题解:

用dijkstra跑单元最短路径,如果对于顶点v,存在一系列边(ui,v)使得dis[v]最小(dis[v]表示0到v的距离)。这些边能且只能选一条,那么我们自然应该选cost最小的那个边了。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 9 typedef long long LL; 10 const int maxn = 1e5 + 10; 11 12 struct Edge { 13 int ne, u, v, c, d; 14 Edge(int ne, int u, int v, int d, int c) :ne(ne), u(u), v(v), d(d), c(c) {} 15 Edge() {} 16 }egs[maxn * 2]; 17 18 struct Heap { 19 int u, d, c; 20 Heap(int u, int d) :u(u), d(d) {} 21 Heap() {} 22 bool operator < (const Heap& tmp) const { 23 return d>tmp.d; 24 } 25 }; 26 27 struct Node { 28 int u, v, w; 29 bool operator < (const Node& tmp) const { 30 return w
pq; 57 dis[0] = 0; 58 pq.push(Heap(0, 0)); 59 while (!pq.empty()) { 60 Heap x = pq.top(); pq.pop(); 61 int u = x.u; 62 if (done[u]) continue; 63 done[u] = true; 64 int p = head[u]; 65 while (p != -1) { 66 Edge &e = egs[p]; 67 if (dis[e.v]>dis[u] + e.d) { 68 dis[e.v] = dis[u] + e.d; 69 pre[e.v] = e.c; 70 pq.push(Heap(e.v, dis[e.v])); 71 } 72 else if (dis[e.v] == dis[u] + e.d) { 73 //这里贪心选cost最小的边 74 if (pre[e.v]>e.c) 75 pre[e.v] = e.c; 76 } 77 p = e.ne; 78 } 79 } 80 ans_d = 0; ans_c = 0; 81 for (int i = 0; i

 

转载于:https://www.cnblogs.com/fenice/p/5469410.html

你可能感兴趣的文章
2017-12-27练习
查看>>
NET设计规范(二) 命名规范
查看>>
VMware 9.0.1安装Mac OS X Mountain Lion 10.8.2
查看>>
SSL延迟
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>
深入理解DIP、IoC、DI以及IoC容器
查看>>
赋值文件
查看>>
Vue 数组 字典 template v-for 的使用
查看>>
蓝牙模块选择经验谈
查看>>
java中==和equals
查看>>
CCActionPageTurn3D
查看>>
python random
查看>>
esp32-智能语音-cli(调试交互命令)
查看>>
netty与MQ使用心得
查看>>
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
查看>>
swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端...
查看>>
Python学习笔记
查看>>
unshift()与shift()
查看>>
使用 NPOI 、aspose实现execl模板公式计算
查看>>
行为型模式:中介者模式
查看>>