Heavy Transportation
Heavy Transportation(POJ 1793)
写这题被坑了好几次,这题解法思路就是在最短路中用权值最大的边为基础不断更新可以用朴素dijkstra,堆优化dijkstra, spfa,kurskal等。
注意:1.数据量大要用cin,cout会TLE 2.图是无向图不是有向图 3.输出格式记得每组答案后面有两回车
ac代码如下 | |
---|---|
1.朴素版Dijkstra
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;//求边权的最小值最大
const int N = 1010, INF = 0x3f3f3f3f;
int g[N][N];
int dist[N];
bool st[N];int dijkstra(int n)
{memset(st, false, sizeof st);memset(dist, -1, sizeof dist); //所有1到x的距离设置负无穷 dist[1] = INF;for(int i = 1; i < n; ++i) {int t = -1;for(int j = 1; j <= n; ++j)if(!st[j] && (t == -1 || dist[j] > dist[t])) //最小的最大,每个都最大,最小的一定大 t = j;st[t] = true;for(int j = 1; j <= n; ++j)dist[j] = max(dist[j], min(dist[t], g[t][j])); //从1到t,再从t到j可能更优 } return dist[n];
}int main()
{int T;scanf("%d", &T);for(int i = 1; i <= T; ++i){int n, m;scanf("%d%d", &n, &m);memset(g, -1, sizeof g); //边设置为负无穷while(m--){int a, b, c;scanf("%d%d%d", &a, &b, &c); g[a][b] = g[b][a] = max(g[b][a], c); //无向边 (max防重边,这题没重边,可以去掉)}printf("Scenario #%d:\n%d\n\n", i, dijkstra(n));}return 0;
}
朴素版Dijkstra耗时如下
2.堆优化版Dijkstra
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;//求边权的最小值最大
typedef pair<int, int> PII;
const int N = 1010, M = 1e5, INF = 0x3f3f3f3f;
int e[M], w[M], ne[M], h[N], idx;
int dist[N]; //保存从1到n的所有边中最小的边最大
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void init()
{idx = 0;memset(h, -1, sizeof h);
}int dijkstra(int n)
{memset(dist, -1, sizeof dist); //先将所有边初始化为-1 memset(st, false, sizeof st);dist[1] = INF; //起点设为最大 priority_queue<PII> heap;heap.push({dist[1], 1});while(!heap.empty()){int key = heap.top().second; heap.pop();if(st[key]) continue; // 已经用dist[key]更新过,无需重复进行 st[key] = true;for(int i = h[key]; i != -1; i = ne[i]){int &j = e[i];if(dist[j] < min(dist[key], w[i])) //最小的最大,每个都尽量大,最小的一定大 //从1->t->j可能比1->j更优解 {dist[j] = min(dist[key], w[i]);heap.push({dist[j], j});}}}return dist[n];
}int main()
{int T;scanf("%d", &T);for(int i = 1; i <= T; ++i){init(); //链式向前星初始化 int n, m; scanf("%d%d", &n, &m);while(m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c); //无向边是特殊的有向边 }printf("Scenario #%d:\n%d\n\n", i, dijkstra(n));}return 0;
}
看起来堆优化版Dijkstra效果不佳啊
3.Kruskal版
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;const int N = 1010, M = 1e5, INF = 0x3f3f3f3f;
struct Edge{ //存边,重载运算符好从小到大排序 int u, v, w;bool operator < (const Edge& t) const {return w > t.w;}
}edges[M];int p[N];
int find(int u){ //并查集 return u == p[u] ? p[u] : p[u] = find(p[u]);
}int main()
{int T;scanf("%d", &T);for(int i = 1; i <= T; ++i){int n, m;scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i) p[i] = i;for(int j = 0; j < m; ++j){int a, b, c;scanf("%d%d%d", &a, &b, &c);edges[j] = {a, b, c};}//kruskal sort(edges, edges + m); //边从大到小排序 int ans = INF;for(int j = 0; j < m && find(1) != find(n); ++j) //不连通 联通说明一定是选从大到小的边 {int &u = edges[j].u, &v = edges[j].v, &w = edges[j].w;int p1 = find(u), p2 = find(v);if(p1 != p2) //两个顶点不连通,那么一定会被一条最或多条大的边连起来 {p[p1] = p2;ans = min(ans, w); //1和n联通 用到的最小边便是答案, 其他联通用的边一定 >= ans }}printf("Scenario #%d:\n%d\n\n", i, ans);}return 0;
}
Kruskal还算快,写起来也方便
4.SPFA版本
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;//求边权的最小值最大
const int N = 1010, M = 1e5 + 10;
int dist[N];
bool st[N];
int e[M], w[M], ne[M], h[N], idx;void init()
{idx = 0;memset(h, -1, sizeof h);
}void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}int spfa(int n)
{memset(dist, -1, sizeof dist);memset(st, false, sizeof st); //存储顶点是否在队列 dist[1] = 1e9;queue<int> q;q.push(1);st[1] = true;while(!q.empty()){int t = q.front();q.pop();st[t] = false;for(int i = h[t]; i != -1; i = ne[i]){int &j = e[i];if(dist[j] < min(dist[t], w[i])){dist[j] = min(dist[t], w[i]);if(!st[j]){q.push(j);st[j] = true;}}}}return dist[n];
}int main()
{int T;scanf("%d", &T);for(int i = 1; i <= T; ++i){int n, m;scanf("%d%d", &n, &m);init();while(m--){int a, b, c;scanf("%d%d%d", &a, &b, &c); add(a, b, c), add(b, a, c);}printf("Scenario #%d:\n%d\n\n", i, spfa(n));}return 0;
}
好吧,快速最短路算法有点大失所望了
Tips: 朝着区域赛冲!!!!!!!!!
Heavy Transportation相关推荐
- C - Heavy Transportation POJ - 1797
C - Heavy Transportation POJ - 1797 求从1~n的最大载货量 #include<iostream> #include<cstring> #in ...
- POJ 1797 Heavy Transportation 解题报告
分类:图论,生成树,最短路,并查集 作者:ACShiryu 时间:2011-7-28 地址:ACShiryu's Blog Heavy Transportation Time Limit: 3000M ...
- Heavy Transportation(最短路)
Heavy Transportation(最短路) Time limit:3000 ms Memory limit:30000 kB OS:Linux judge:https://vjudge.net ...
- Heavy Transportation重型运输(Dijkstra算法 - 详解)
目录 Heavy Transportation重型运输 题意描述及解题思路 这个题主要是给你多条雨果到客户位置的路,举个例子
- 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化
今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...
- 【POJ No. 1797】重型运输 Heavy Transportation
[POJ No. 1797]重型运输 Heavy Transportation POJ题目地址 [题意] Hugo需要将巨型起重机从工厂运输到他的客户所在的地方,经过的所有街道都必须能承受起重机的重量 ...
- Heavy Transportation(Dijkstra算法)
题目: Hugo Heavy很高兴.在Cargolifter项目破裂后,他现在可以扩展业务.但他需要一个聪明的人告诉他,他的客户是否真的有办法将他的巨型钢制起重机建造到需要所有街道都能承受重量的地方. ...
- POJ 1797 Heavy Transportation
传送门:http://poj.org/problem?id=1797 不想吐槽了,弄了好久才AC 实现代码: #include <cstdio> #include <cstring& ...
- POJ 1797 Heavy Transportation
题意: 给出一个有N个节点的无向图和 M 条边,每条边都有一个重力承受度,要从中找出一条从 1 节点到 n节点的路径,使得可以经过的车辆载重最大. 分析: 类似于最大流中找增广路,在求最短路的松弛操作 ...
最新文章
- 大掌门2显示服务器繁忙,《大掌门2》二周年庆典开启 真传弟子潇洒归来
- python 调用 tensorflow,C++与python 相互调用-- c++调用tensorflow教程
- Graph Search图谱搜索
- BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】
- STM32 CAN过滤器
- SAP Spartacus CORS 设置
- KindEditor js 路径修改及表单提交注意事项
- P4428-[BJOI2018]二进制【树状数组,set】
- mysql高效获取两张表共同字段的交集数据
- Php重启校时,php远程校时
- Linux-2.6.32 NUMA架构之内存和调度
- MVC4 Model ValueProvider
- CF55D Beautiful numbers
- java ZipEntry 压缩 解压缩 在linux下中文乱码问题解决
- 计算机中英文标点符号对照表,常用中文标点符号和键盘对照表.doc
- RSA 加解密(Java 实现)
- 163邮箱满了怎么办?无限容量,超大附件带你畅游文件的海洋
- gif制作动图超简单,手把手教会用图片做gif动图
- android开发实例学习笔记之简易相册的实现
- 数字孪生助力智慧城市智能化发展
热门文章
- 嵌入式linux设备驱动程序是,嵌入式Linux设备驱动开发之:按键驱动程序实例-嵌入式系统-与非网...
- php header apk,php常用的header头
- mysql8.0.11密码_mysql8.0.11安装和修改密码(转载)
- 4G通信技术LTE介绍
- php 小程序自定义图,微信小程序之如何使用自定义组件封装原生 image 组件
- python空集合_python空集合
- 检查是否禁止asp.net服务扩展_在 Kubernetes 环境下部署 OpenWhisk 服务
- Firebase可监控网页应用程序效能 更新其Analytics受众系统
- C# DataTable 用法
- Vue SSR(Vue2 + Koa2 + Webpack4)配置指南