【Codeforces 229B】Planets
2024-09-07 10:27:31
【链接】 我是链接,点我呀:)
【题意】
【题解】
设dis[i]表示到达i号传送器的最早时刻.
显然,虽然有那么多的出发时刻的限制,但我们还是越早到越好的.
因为你到得越早,出发的时间肯定不会比到达的时刻晚的差.
所以,就是一个最短路的问题啦.
因为数据范围比较大.
所以得用dijkstra+优先队列的优化.
在出去的时候,只要枚举一遍到达这个点的所有时刻,就能知道它啥时候出发了.
因为∑ki
【代码】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
using namespace std;
const int N = 1e5;
int n,m;
vector<pair<int,int> > g[N+10];
vector<int> a[N+10];
int dis[N+10];
priority_queue<pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > pq;
int main()
{
scanf("%d%d",&n,&m);
rep1(i,1,m){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x].push_back(make_pair(y,z));
g[y].push_back(make_pair(x,z));
}
for (int i = 1;i <= n;i++){
int cnt;
scanf("%d",&cnt);
rep1(j,0,cnt-1){
int x;
scanf("%d",&x);
a[i].push_back(x);
}
}
rep1(i,1,n) dis[i] = -1;
dis[1] = 0;
pq.push(make_pair(0,1));
while (!pq.empty()){
pair<LL,int> temp = pq.top();pq.pop();
int x = temp.second;LL disx = temp.first;
if (dis[x]<disx) continue;
rep1(i,0,(int)a[x].size()-1)
if (a[x][i]==disx)
disx++;
for (pair<int,int> temp1:g[x]){
int y = temp1.first,cost = temp1.second;
if (dis[y]==-1 || dis[y]>cost+disx){
dis[y] = cost+disx;
pq.push(make_pair(dis[y],y));
}
}
}
cout<<dis[n]<<endl;
return 0;
}
最新文章
- jquery.uploadify文件上传组件
- [解决方案]CREATE DATABASE statement not allowed within multi-statement transaction.
- Ubuntu菜鸟入门(八)—— QQ安装
- Droidbox恶意软件动态分析环境搭建
- MongoDB GridFS 对图片进行增删改
- Visual C++ 中的重大更改
- HTTP POST GET详解
- C#判断字符串是否为数字
- c++内置函数---7
- OpenDaylight之openflowjava的编译
- Xcode7创建纯代码空白工程
- phpcms(1)phpcms V9 MVC模式 与 URL访问解析(转)
- 将EmEditor加入到鼠标右键菜单
- iOS_SN_基于AFNetworking3.0网络封装
- STM32之中断与事件---中断与事件的区别
- selenium7种元素识别
- Find all factorial numbers less than or equal to N
- junit忽略测试方法
- 用chrome和anywhere,配合安卓机搭建最简单的移动端页面测试。
- 使用viewport中的vm来适配移动端页面