最短路(Dijkstra) HDOJ 4318 Power transmission
2015-08-24 14:48
211 查看
题目传送门
题意:起点s到终点t送电,中途会有损耗,问最小损耗是多少
分析:可以转换为单源最短路问题,用优先队列的Dijkstra版本,d[]表示从s出发到当前点的最小损耗,用res保存剩下的电量。当到达t就结束,因为按照w从小到大排序,访问过的点都已经最优,这是贪心思想
收获:复习了Dijkstra,进一步理解Dijkstra的贪心的思想(程序跑得慢,还可优化)
代码:
题意:起点s到终点t送电,中途会有损耗,问最小损耗是多少
分析:可以转换为单源最短路问题,用优先队列的Dijkstra版本,d[]表示从s出发到当前点的最小损耗,用res保存剩下的电量。当到达t就结束,因为按照w从小到大排序,访问过的点都已经最优,这是贪心思想
收获:复习了Dijkstra,进一步理解Dijkstra的贪心的思想(程序跑得慢,还可优化)
代码:
/************************************************ * Author :Running_Time * Created Time :2015-8-24 9:51:51 * File Name :I.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; typedef pair<int, int> P; const int N = 5e4 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; struct Edge { int v; double w, res; bool operator < (const Edge &r) const { return w > r.w; } }; vector<Edge> G ; bool vis ; double d ; int n, s, t; double M; void Dijkstra(void) { priority_queue<Edge> Q; memset (vis, false, sizeof (vis)); for (int i=1; i<=n; ++i) d[i] = INF; d[s] = 0; Q.push ((Edge) {s, 0, M}); while (!Q.empty ()) { Edge r = Q.top (); Q.pop (); int u = r.v; double res = r.res; if (vis[u]) continue; vis[u] = true; if (u == t) { printf ("%.2f\n", M - res); return ; } for (int i=0; i<G[u].size (); ++i) { int v = G[u][i].v; double w = G[u][i].w; if (!vis[v] && d[v] > d[u] + res * w) { d[v] = d[u] + res * w; Q.push ((Edge) {v, d[v], res - res * w}); } } } puts ("IMPOSSIBLE!"); } int main(void) { while (scanf ("%d", &n) == 1) { for (int i=1; i<=n; ++i) { G[i].clear (); int k; scanf ("%d", &k); for (int j=1; j<=k; ++j) { int v; double w; scanf ("%d%lf", &v, &w); w /= 100; G[i].push_back ((Edge) {v, w}); } } scanf ("%d%d%lf", &s, &t, &M); Dijkstra (); } return 0; }
相关文章推荐
- 项目总结—jQuery EasyUI- DataGrid使用
- linux中搭建SVN服务器(CentOs6.5)
- android color.xml
- iOS第三方开源库的吐槽和备忘
- Android IM(五)连接断开重连
- Linux 文件操作
- JAVA代码url请求
- [LeedCode OJ]#171 Excel Sheet Column Number
- extjs4 之单元格编辑 获取列对象
- C#堆内存分配和栈内存分配
- 论文笔记 《What makes for effective detection proposals?》
- SQLite组合主键设置外键以及出现外键匹配出错System.Data.SQLite.SQLiteException (0x80004005) SQL logic error or missing d
- Android系统自带样式(android:theme)
- 迭代中删除元素
- eclipse文本编码格式修改为UTF-8 (转)
- CMYK印刷色
- 黑马程序员——线程Thread一(线程创建)
- Netty之有效规避内存泄漏
- BCC校验
- tomcat的work目录的作用