NUIST LevOJ P1857 孤独摇滚
(严查出题者成分..
题目描述
绰号 "小孤独" 的后藤独,是一位喜爱吉他的孤独少女。 她经常在家里独自弹奏吉他,但因为一些事情,加入了伊地知虹夏领衔的 “纽带乐队”。 不敢在他人面前演奏的后藤,能否成为一个出色的乐队成员呢?
哈... 尽管故事没有结束... 但可以确定的是,现在,在学校的文化节上,为了参加表演, 她必须从教学楼里,走到隔壁的体育馆里去。
因为文化节的缘故,到处都挤满了同学,社恐的后藤同学好像马上就要融化了。 参加活动的同学们,都聚集在一些教室或者摊位附近,为了前往体育馆,"小孤独" 不得不穿越一些人群。
你必须赶在这位吉他英雄升天前,帮她规划出一条前往体育馆的路线, 首先要保证的当然是,路上遇到的人越少越好,其次的话,总路程也是越短越好.
请告诉小孤独,她最少会遇到多少人,要走多少路。
输入描述
第一行,四个正整数 n, m, s, t,分别代表 有 n 个挤满了人的地点, 有 m 条连着两个地点的路,使得两个地点间可以双向通行, 小孤独正在第 s 个地点,而体育馆是第 t 个地点。(n,m≤10^5)
第二行,n 个用空格分开的整数 ai (0≤ai≤200, i∈[1,n]) 第 i 个数字表示第 i 个地点处有 ai 个人
接下来 mm 行,每行 33 个正整数 u v w 代表 第 u 个地点 和 第 v 个地点 之间有一条长度为 w 的双向道路 (1≤w≤10^9)
输出描述
两个整数,遇到的总人数和总路程,中间用空格隔开。
样例输入
5 5 1 5
1 10 10 20 100
1 2 1
2 3 1
1 4 1
4 5 100
3 5 1
样例输出
121 3
分析
典型的最短路径问题,第一标尺是最少人数,第二标尺是最短路程。由于1e5的数据规模,限制了最短路径算法只能使用SPFA或者堆优化的Dijkstra。
这里选择堆优化的Dijkstra,用STL的priority_queue模拟堆来维护源点到未选取点集的最短边(d[u]),定义结构体类型的node结点,使优先队列和邻接表配合使用。
要注意的是,d数组要开long long,否则会超范围。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int N = 1e5 + 10;
const int INF = 1e9;
int n, m, s, t;
int c[N];struct node{int id, w, num;node(int id_, int num_, int w_ = 0):id(id_), num(num_), w(w_) {}bool operator < (const node &W) const {return num > W.num;}
};vector<node> g[N];
bool vis[N] = {false};
long long d[N], v[N];void dj() {fill(d, d + N, INF);fill(v, v + N, INF);v[s] = c[s];d[s] = 0;priority_queue<node> q;q.push(node(s, v[s]));while(!q.empty()) {node front = q.top();q.pop();int u = front.id;//cout << "u=" << u << endl; if(u == t) break;if(vis[u] == true) continue;vis[u] = true;for(int j = 0; j < g[u].size(); j++) {int id = g[u][j].id;int w = g[u][j].w;if(vis[id] == false) {if(v[u] + c[id] < v[id]) {v[id] = v[u] + c[id];q.push(node(id, v[id]));d[id] = d[u] + w;//cout << id << " " << v[id] << " " << d[id] << endl;} else if(v[u] + c[id] == v[id] && d[id] > d[u] + w) {d[id] = d[u] + w;//cout << id << " " << v[id] << " " << d[id] << endl;}}}}
}int main() {cin >> n >> m >> s >> t;int x, y, w;for(int i = 1; i <= n; i++) {scanf("%d", &c[i]);}for(int i = 1; i <= m; i++) {scanf("%d%d%d", &x, &y, &w);g[x].push_back(node(y, c[y], w));g[y].push_back(node(x, c[x], w));}dj();cout << v[t] << " " << d[t] << endl;return 0;
}
NUIST LevOJ P1857 孤独摇滚相关推荐
- NUIST LevOJ P1763 friendly group
题目描述 Professor Alex will organize students to attend an academic conference. Alex 教授将要组织学生参加学术会议. Al ...
- NUIST LevOJ P1684 炼丹术
题目描述 三水最近在学习炼丹术.但是众所周知炼丹术是一门危险的学科,需要大量的调参才能保证安全.好在三水在洗衣机里面找到了一张失传已久的图纸,里面记录了若干种材料的药性.这张图纸上记录了 n 种不同的 ...
- NUIST LevOJ P1826 荷取的基站布局 (状态压缩dp
题目描述 草根妖怪网络科技有限公司正委托河童重工架设若干个基站. 架设地点可以抽象成一个 n * n 的方格阵.每个基站提供信号的范围是其临近的上下左右四格(如果存在) 为了避免资源浪费,需要保证对于 ...
- 首届 Rust China Hackathon Online 参赛队伍名单出炉
Rust for Fun! 首届 Rust China Hackathon Online 参赛队伍名单新鲜出炉,恭喜如下队伍.从明天(12月15日)开始就可以开始比赛了. 请注意赛程安排: 赛程安排 ...
- 精彩回顾 I Rust China Hackathon 2022 达坦科技组
由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛.达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道.达坦科技组的赛题 ...
- RSS Can:使用 Golang Rod 解析浏览器中动态渲染的内容:(四)
第四篇文章,来聊聊 Golang 生态中如何"遥控"浏览器,更简单.可靠的使用基于 CDP (Chrome DevTools Protocol)协议的浏览器作为容器,获取诸如微博. ...
- 网易云VIP音乐NCM文件转MP3,C语言版本
前言 网易云的Vip音乐下载下来,格式不是mp3/flac这种通用的音乐格式,而是经过加密的ncm文件.只有用网易云的音乐App才能够打开.于是想到可不可以把.ncm文件转换成mp3或者flac文件, ...
- 刘翔跟着崔健孤独地飞了
[b][size=medium]刘翔跟着崔健孤独地飞了[/size][/b] 作者 /张晓舟来源 /张晓舟博客 我垃圾成山的专栏写作生涯中,有两篇文章有着诡异的命运,其影响力远远超过了原有领域:< ...
- 好听的摇滚_中国摇滚最经典的十大经典老歌,令无数歌迷疯狂,首首好听到爆!...
10.<怒放的生命> <怒放的生命>是由汪峰作词,汪峰作曲,由汪峰演唱.这首歌也是第13届全球华语音乐榜中榜年度最佳歌曲奖. 8.<孤独的人是可耻的> <孤独 ...
最新文章
- 如何提高模型性能?这四大方法值得尝试 | CSDN 博文精选
- Django实战之美化页面
- 微会动微信现场互动:2019年会展和活动产业的发展趋势
- Centos安装tomcat,haproxy,jdk
- optee中添加一个中断以及底层代码的相关解读
- Php错误邮件提示linux,linux下phpmailer发送邮件出现SMTP ERROR: Failed to connect to server: (0)错误...
- LeetCode 1278. 分割回文串 III(区间DP)
- 七年级认识计算机课件,认识计算机(七年级)ppt课件
- 中科曙光:与VMware合资公司是技术公司
- 猴子爬山编程java_Java趣味编程100例
- Linux经常使用到的操作
- java 线程意外中断重启处理办法(观察者模式)
- 【Excel2019(六):数据透视表】【创建数据透视表+更改数据透视表汇总方式+数据透视表中的组合+汇总多列数据+创建计算字段+生成多张工作表】
- 华大MCU(五):HC32F460串口IAP升级boot部分
- 书籍《图说区块链》读后感
- VOLTE_SRVCC和ESRVCC
- 视频教程-用Java从零开始开发一个物联网项目-物联网技术
- 移动应用崩溃日志收集工具对比
- 计算二维紧束缚模型费米面和nesting程序新思路
- cad高程测绘图lisp_已知CAD中的高程测绘图,很多点,如何求出所有高程的平均值呢?难道只能用计算器一个一个的相加来算吗?...