[CF1801D] The way home
[CF1801D] The way home
Description
一个人在一张有向图的 -1
。
Solution
首先我们先考虑该题这个人的表演策略,即如果回家的路径确定了,那么我们直接考虑表演的策略。显然有他在某一个点
于是我们考虑先对
考虑用类似堆优化迪杰斯特拉实现。注意取整需要考虑被除数为负数的情况,建议手写。
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n,m,p;
const int N=800+7;
vector<pair<int,int>> G[N];
bool vis[N],_vis[N];
int cost[N],res[N];
int dis[N],b[N];
struct node{
int dis,id;
friend bool operator < (node a,node b){
return a.dis>b.dis;
}
};
struct node2{
int x,cost,res;
friend bool operator < (node2 a,node2 b){
if(a.cost!=b.cost) return a.cost>b.cost;
return a.res<b.res;
}
};
void Dj(int s){
memset(_vis,0,sizeof _vis);
priority_queue<node> q;
memset(dis,80,sizeof dis);
dis[s]=0;
q.push({0,s});
while(!q.empty()){
int u=q.top().id;
q.pop();
if(_vis[u]) continue;
_vis[u]=1;
for(auto i:G[u]){
int k=i.first,w=i.second;
if(dis[k]>dis[u]+w){
dis[k]=dis[u]+w;
q.push({dis[k],k});
}
}
}
}
//int _ceil(int x,int y){
// if(x<0)return 0;
// if(x%y==0)return x/y;
// return x/y+1;
//}
int _ceil(int x,int y){if(x<0) return 0;return (x+y-1)/y;}
void Get_ans(){
memset(vis,0,sizeof vis);
priority_queue<node2> q;
cost[1]=0,res[1]=p;
q.push((node2){1,cost[1],res[1]});
while(!q.empty()){
int u=q.top().x;
q.pop();
if(vis[u]) continue;
vis[u]=1;
Dj(u);
for(int i=1;i<=n;i++){
if(!vis[i]){
// int times=(int)ceil((dis[i]-res[u])*1.0/b[u]);
int times=_ceil(dis[i]-res[u],b[u]);
// printf("times:%lld\n",times);
node2 tmp={i,cost[u]+times,res[u]+times*b[u]-dis[i]};
node2 bf={i,cost[i],res[i]};
if(bf<tmp){
q.push(tmp);
cost[i]=tmp.cost;
res[i]=tmp.res;
}
}
}
}
}
void solve(){
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=n;i++){
G[i].clear();
scanf("%lld",&b[i]);
vis[i]=0;cost[i]=0x3f3f3f3f3f3f3f3f;res[i]=0;
}
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
G[u].push_back(make_pair(v,w));
}
Dj(1);
// for(int i=1;i<=n;i++) printf("%d ",dis[i]);
if(dis[n]==dis[0]) return printf("-1\n"),void();
Get_ans();
printf("%lld\n",cost[n]);
}
signed main(){
cin>>T;
while(T--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现