Dijkstra(变形) POJ 1797 Heavy Transportation
2015-11-27 17:06
351 查看
题目传送门
题意:求1到n的最大载重量
分析:那么就是最大路上的最小的边权值,改变优先规则.
题意:求1到n的最大载重量
分析:那么就是最大路上的最小的边权值,改变优先规则.
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef long long ll; const int N = 1e3 + 10; const int E = 1e5 + 10; const int INF = 0x3f3f3f3f; struct Edge { int v, w, nex; Edge() {} Edge(int v, int w, int nex) : v (v), w (w), nex (nex) {} bool operator < (const Edge &r) const { return w < r.w; } }edge[E]; int head ; int d ; bool vis ; int n, m, e; void init(void) { memset (head, -1, sizeof (head)); e = 0; } void add_edge(int u, int v, int w) { edge[e] = Edge (v, w, head[u]); head[u] = e++; } void Dijkstra(int s) { memset (d, 0, sizeof (d)); memset (vis, false, sizeof (vis)); d[s] = INF; priority_queue<Edge> que; que.push (Edge (s, 0, 0)); while (!que.empty ()) { int u = que.top ().v; que.pop (); if (vis[u]) continue; vis[u] = true; for (int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v, w = edge[i].w; if (!vis[v] && d[v] < min (d[u], w)) { d[v] = min (d[u], w); que.push (Edge (v, d[v], 0)); } } } } int main(void) { int T, cas = 0; scanf ("%d", &T); while (T--) { init (); scanf ("%d%d", &n, &m); int mx = 0; for (int u, v, w, i=1; i<=m; ++i) { scanf ("%d%d%d", &u, &v, &w); if (n == 1 && u == 1 && v == 1) mx = max (mx, w); add_edge (u, v, w); add_edge (v, u, w); } printf ("Scenario #%d:\n", ++cas); if (n == 1) { printf ("%d\n", mx); continue; } Dijkstra (1); printf ("%d\n\n", d ); } return 0; }
相关文章推荐
- 使用Memcached提高.NET应用程序的性能
- 页面中如何让标点不出现在行首
- Handler, Loop, MessageQueue的工作原理
- 我们正处于一个绝佳的时期-工业4.0感受
- POJ1836 双向LIS
- Linux多线程与同步
- 基于OCS实现高速缓存
- savedInstanceState吐血详解
- LAMP一体环境快速安装
- Eclipse配置Tomcat服务器
- clientX,pageX,screenX,offsetLeft,scrollTop
- Photoshop投影与CSS中box-shadow的转换
- Android自助餐之SQLite
- MySQL的btree索引和hash索引的区别
- Linux进程间通信
- MyEclipse jQuery智能 提示
- 4Sum
- Photoshop CS6最新官方正式中文破解版(32位、64位)
- 23设计模式之工厂方法(FactoryMethod)
- 在父页面获取子页面元素值的方法