CodeForces - 938D-Buy a Ticket+最短路
2024-09-01 07:13:26
题意:有n个点和m条路(都收费),n个点在开演唱会,门票不同,对于生活在n个点的小伙伴,要求计算出每个小伙伴为了看一场演唱会要花费的最小价格;
思路:
这道题我一开始觉得要对每一个点都跑一次最短路,
然而只用把dis【】的每个点初始化成每个地方的门票价格,在放入优先队列中,接着再跑一遍Dijkstra;
对Dijkstra刷新了认识。至于原理:
(可以想明白,每次在队列中找到最小的门票价格去更新(松弛);
注意路费要计算来回;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = +; vector<pair<int,ll> >mp[maxn];
priority_queue<pair<ll,int> >q;
ll dis[maxn]; int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v;
ll c;
scanf("%d%d%I64d",&u,&v,&c); //因为long long 和int ;还有%I64d,wa了多次;
mp[u].push_back(make_pair(v,c*));
mp[v].push_back(make_pair(u,c*));
} for(int i=;i<=n;i++)
{
ll x;
scanf("%I64d",&x);
dis[i]=x;
q.push(make_pair(-dis[i],i));
} while(!q.empty())
{
int now = q.top().second;
ll w = q.top().first;
q.pop(); if(dis[now] != -w)continue; //这一步也比较重要;既然这个点被其他点松弛过,就不能去松弛别点;
for(int t=;t<mp[now].size();t++)
{
int to = mp[now][t].first;
if(dis[to]>dis[now]+mp[now][t].second)
{
dis[to]=dis[now]+mp[now][t].second;
q.push(make_pair(-dis[to],to));
}
}
}
for(int i=;i<=n;i++)
{
printf("%I64d%c",dis[i],i==n?'\n':' ');
} return ;
}
最新文章
- 【转载】latch: cache buffers chains
- c#常见的错误集合
- js通过继承实现私有函数
- centos7 gitlab
- mysql 线程池 数据库连接池
- DJANGO中,用QJUERY的AJAX的json返回中文乱码的解决办法
- hbase 0.96 java 示例
- cf492C Vanya and Exams
- Java web项目综合练习(Estore)
- 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
- CI框架简单使用
- 采用ftpServer构建嵌入式ftp服务器时设置pass功能
- Eclipse同时显示两个编辑窗口
- SQLServer中处理亿万级别的数据
- 动态获取移动端视宽,从而结合rem达到适配
- 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)
- spring cloud ribbon和feign的区别
- sublime+LatexTools引用参考文献
- 使用win10自带邮件应用发送文件
- php 中 FastCGI与cgi的关系,何为fastcgi