AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 4907. 哞路线II    原题链接    中等

作者: 作者的头像   季科 ,  2023-12-01 16:21:41 ,  所有人可见 ,  阅读 72


0


#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct Plane{
    int leave,des,arrive;
    bool operator<(Plane& w)const
    {
        return leave<w.leave;
    }
};
vector<Plane> v[N];
int e[N],dist[N],pos[N];
void dfs(int u,int total) //离开u城的最早的时间为t
{
    for(int i=pos[u];i>=0;i--)
    {
        Plane t=v[u][i];
        if(t.leave<total) //如果当前的飞机不可以,那么前面的也一定不可以
        {
            break;
        }
        dist[t.des]=min(dist[t.des],t.arrive); //更新后面的最早结束时间
        pos[u]=i-1; //下次就不走这条线了
        dfs(t.des,t.arrive+e[t.des]);//搜索下条可以走的路线
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int from;
        Plane t;
        cin>>from>>t.leave>>t.des>>t.arrive;
        v[from].push_back(t); //加入到同个航线
    }
    for(int i=1;i<=n;i++)
    {
        cin>>e[i];
        pos[i]=v[i].size()-1;
        sort(v[i].begin(),v[i].end()); //按照离开时间从小到大排序
    }
    memset(dist,0x3f,sizeof dist);
    dist[1]=0; //起点距离
    dfs(1,0); //开始搜索
    for(int i=1;i<=n;i++)
    {
        if(dist[i]==0x3f3f3f3f) cout<<-1<<endl;
        else cout<<dist[i]<<endl;
    }
    return 0;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息