首页 > 其他分享 >Dijkstra/Tarjan-关键边

Dijkstra/Tarjan-关键边

时间:2024-02-03 11:33:55浏览次数:31  
标签:Tarjan 样例 long 100005 Dijkstra edge 街道 关键 id

题目描述

总统要回家,即从s走到t,会经过一些街道,每条街道都是单向的并且拥有权值。现在,为了让总统更好的回家,要对每一条街道进行操作:

①如果该街道一定在最短路上,则输出“YES”。

②如果该街道修理过后,该边所在的最短路可以取代原先的最短路,则输出“CAN x”,x是修改该街道的最小花费,就是权值减小的值。

③如果该街道不在s到t的路径上,或者修改过后权值小于等于0,则输出“NO”。

样例

样例输入

6 7 1 6
1 2 2
1 3 1
1 5 4
3 5 3
2 5 5
2 4 2
5 6 1

样例输出

NO
NO
CAN 1
CAN 1
CAN 4
NO
YES

思路

Dijkstra + Tarjan

priority queue + pair

样例可以自己参考一下图片过一遍,加深影响喵!

顺便推荐一下猫猫画图用的网站喵!免费喵!

Graph Editor

code

#include <bits/stdc++.h>
#define ll long long
#define oo 2000000000
using namespace std;
long long a[100005],b[100005],l[100005],d1[100005],d2[100005],dfn[100005],low[100005],n,m,s,t,id;
bool bridge[100005],vis[100005];
vector<pair<long long,long long>> edge[100005];
void dijkstra(long long v,long long *d){
    long long t;
    priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> q;
    for(long long i=1;i<=n;i++) d[i]=oo;
    d[v]=0;q.push(make_pair(0,v));
    while(!q.empty()){
        t=q.top().second;q.pop();
        for(long long i=0;i<edge[t].size();i++){
            if(d[edge[t][i].first]>d[t]+edge[t][i].second){
                d[edge[t][i].first]=d[t]+edge[t][i].second;
                q.push(make_pair(d[edge[t][i].first],edge[t][i].first));
            }
        }
    }
    return;
}
void tarjan(long long x){
    id++;
    dfn[x]=id;
    low[x]=id;
    for(long long i=0;i<edge[x].size();i++){
        if(vis[edge[x][i].second]) continue;
        vis[edge[x][i].second]=true;
        if(!dfn[edge[x][i].first]){
            tarjan(edge[x][i].first);
            low[x]=min(low[x],low[edge[x][i].first]);
            if(dfn[x]<low[edge[x][i].first]) bridge[edge[x][i].second]=true;
        }
        else low[x]=min(low[x],dfn[edge[x][i].first]);
    }
    return;
}
int main(){
    cin>>n>>m>>s>>t;
    for(long long i=0;i<m;i++) cin>>a[i]>>b[i]>>l[i];
    for(long long i=0;i<m;i++) edge[a[i]].push_back(make_pair(b[i],l[i]));
    dijkstra(s,d1);
    for(long long i=1;i<=n;i++) edge[i].clear();
    for(long long i=0;i<m;i++) edge[b[i]].push_back(make_pair(a[i],l[i]));
    dijkstra(t,d2);
    for(long long i=1;i<=n;i++) edge[i].clear();
    for(long long i=0;i<m;i++){
        if(d1[a[i]]+l[i]+d2[b[i]]==d1[t]){
            edge[a[i]].push_back(make_pair(b[i],i));
            edge[b[i]].push_back(make_pair(a[i],i));
        }
    }
    tarjan(s);
    for(long long i=0;i<m;i++){
        if(bridge[i]) cout<<"YES"<<endl;
        else if(d1[t]-d1[a[i]]-d2[b[i]]-1>0) cout<<"CAN "<<l[i]-(d1[t]-d1[a[i]]-d2[b[i]]-1)<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

标签:Tarjan,样例,long,100005,Dijkstra,edge,街道,关键,id
From: https://www.cnblogs.com/Firepaw-cattery/p/18004466

相关文章

  • 单源正权最短路径——Dijkstra算法
    目录问题引入思路一览算法原理code问题引入给出n点m边,其中边的权值皆为非负数,要求快速给出一个点到其余点的最短距离思路一览dfs遍历维护最短距离floyd算法算全源最短,但是这玩意时间复杂度O(n3),最多也就1000个点左右主角Dijkstra算法算法原理主要是以源点为根节点逐步构......
  • 天合光能行业地位:在全球可持续能源发展中发挥关键作用
    1月18日,天合光能董事长兼CEO高纪凡在达沃斯国际会议中心受邀出席世界经济论坛2024年年会,作为唯一受邀企业家代表,与阿联酋、南非和印度部长共同探讨金砖国家扩增带来的新机遇。此次会议不仅标志着天合光能在全球能源领域的重要地位,也展现了公司在推动全球能源转型方面的决心和能......
  • 10000+AI绘画关键词-涵盖Mid和StableDiffusion
    下载地址:https://pan.quark.cn/s/90634ffdf31910000+AI绘画关键词-涵盖Mid和StableDiffusion......
  • 软件测试/测试管理|项目启动:成功开启新征程的关键一步
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。在项目管理中,项目启动......
  • 异构计算关键技术之多线程技术(三)
    异构计算关键技术之多线程技术(三)一、多线程概述1.多线程的概念与优劣多线程是指在程序中同时运行多个线程,每个线程都可以独立执行不同的代码段,且各个线程之间共享程序的数据空间和资源。优劣:优点:提高程序的处理能力,增加相应速度和交互性。缺点:线程的切换有一定的开销,且多线程容易......
  • 政府单位如何选择高效的安全数据交换系统?关键看4点
    政府作为我国重要组织单位,数据安全性至关重要,为了保障网络和数据安全,政府内部一般通过物理隔离或逻辑隔离的方式,因此,政府单位进行文件交换具有一定的特殊要求。一般来说,常见的政府内部文件交换工具有以下几种:电子公文传输系统:这是政府内部常用的一种文件交换工具,通过该系统,政府部......
  • 标识符和关键词
    标识符关键字Java所有的组成部分都需要名字、类名、变量名以及方法名都被称为标识符。标识符注意点所有的标识符都应该以字母(A-Z或者a-z),美元符($),或下划线(_)开始首字符之后可以是字母,美元符,下划线或者数字的任何字符组合不能使用关键词作为变量名或方法名标识符......
  • mysql找出不包含某些关键字的结果
    比如公司业务是和房产相关的,但是库里存在和房产不相关的内容时就需要筛选并删除。如何筛选才能不误伤呢?这是我的一个初步的SQL: 意思是如果name、desc字段都不包含房、盘、楼、地产关键字才找出来。如下: 这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎......
  • vs+qt中使用opengl及关键报错“无法打开包括文件: no such file or directory”与“err
    参考链接https://blog.csdn.net/qq_22533607/article/details/79792083http://t.csdnimg.cn/T8II5http://t.csdnimg.cn/JP8k7基础准备:vs中配置qt插件(略)关键步骤:创建QtWidgetApplication项目将BaseClass修改成QWidget,方框中的内容可以不勾,个人习惯ui文件中添加open......
  • [转] 创建系统关键位置的快捷方式.lnk
    前言全局说明创建系统关键位置的快捷方式.lnk一、资源管理器本身的特殊参数。我们都使用过系统自动创建的回收站、控制面板、下载文件夹等快捷方式,但它们是如何工作的,用户能不能自行创建这些关键位置的快捷方式呢?事实上,这些资源管理器内部的特殊位置是由系统在注册表中定......