[HAOI2012] 道路

【HAOI2012/Luogu2505】道路 最短路DAG 原题走这里 本题的整个思想十分暴力。 首先,既然最多只有1500个点,那么就可以枚举最短路的起点,然后把最短路的条数累加到各条边上就可以了。 然而,枚举出每一条最短路再累加明显是不现实的,于是我们还需要另一个东西:最短路DAG 最短路DAG,说白了就是由一张图上所有的以某个节点为起始点的最短路构成的图。 或者更加抽象一点就是所有满足dis[v]=dis[u]+a[u][v]dis[v]=... 阅读详情

这道题首先我们应该考虑到的是,因为我们最短路的起点和终点都不知道,所以我么应该枚举起点,然后跑最短路

我们枚举起点之后,每次跑最短路,都可以构造出一个最短路图(由所有在最短路上的边构成)

判断一条边在不在最短路图的方法是如果dis[v]=dis[u]+length(u,v)dis[v]=dis[u]+length(u,v)dis[v]=dis[u]+length(u,v),那么他在最短路图上

那么我们接下来要枚举最短路图上的每条边,对于一条边(u,v)(u,v)(u,v),我们需要处理出的是从sss到uuu的最短路图上的路径条数,和vvv到每个点的最短路图上的路径图,因为最短路图是一个DAG,所以我们可以通过拓扑排序上dpdpdp来解决

对于第一个问题,很好解决

第二个问题,由于不知道终点,不太好处理,但是我们知道起点啊!所以我们可以通过建立反图来解决

但是建反图不好建怎么办?

我们可以考虑,我们往下转移的时候,下面的点的拓扑序一定比这个点要大,所以我们可以按拓扑序逆序处理就好了

还有一个问题:为什么这题会卡掉dijkstradijkstradijkstra呢

我们看dijsktradijsktradijsktra的复杂度,这道题因为要枚举起点,复杂度是O(nmlog⁡m)O(nm\log m)O(nmlogm),显然是容易被卡的

为什么spfaspfaspfa没有spfaspfaspfa呢?

因为我们要从每个点都跑一边最短路啊,spfaspfaspfa均摊是O(km)O(km)O(km)啊,出题人显然不会花时间在这上面为了卡掉spfaspfaspfa,而且数据很难构造

代码啦:

#include <bits/stdc++.h>
using namespace std;

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)

typedef long long ll;

const int N=10005;
const int mod=1e9+7;

template <typename T> void read(T &x){
    x=0;int f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
    x*=f;
}

int n,m;
int head[N],cnt;
int tpx[N],inde[N],tot;
int dis[N];
ll f[N],g[N];
bool inq[N],is[N];
ll ans[N];

struct Edge{
    int from,to,next,w;
}e[N<<1];

void add(int x,int y,int c){
    e[++cnt]=(Edge){x,y,head[x],c},head[x]=cnt;
}

void spfa(int s){
    memset(dis,0x3f,sizeof(dis));
    queue<int> q;
    q.push(s);
    dis[s]=0;
    inq[s]=true;
    while(!q.empty()){
        int u=q.front();q.pop();
        inq[u]=false;
        RepG(i,u){
            int v=e[i].to;
            if(dis[v]>dis[u]+e[i].w){
                dis[v]=dis[u]+e[i].w;
                if(!inq[v])inq[v]=true,q.push(v);
            }
        }
    }
    Rep(i,1,m)
        if(dis[e[i].from]+e[i].w==dis[e[i].to])is[i]=true,inde[e[i].to]++;
        else is[i]=false;
}

void topo(){
    queue<int> q;
    Rep(i,1,n)if(!inde[i])q.push(i);
    tot=0;
    while(!q.empty()){
        int u=q.front();q.pop();
        tpx[++tot]=u;
        RepG(i,u){
            if(!is[i])continue;
            int v=e[i].to;
            inde[v]--;
            if(!inde[v])q.push(v);
        }
    }
}

void update(int s){
    memset(f,0,sizeof(f));
    memset(g,0,sizeof(g));
    f[s]=1;
    Rep(i,1,tot){
        int u=tpx[i];
        RepG(i,u){
            if(!is[i])continue;
            int v=e[i].to;
            f[v]+=f[u];
        }
    }
    _Rep(i,tot,1){
        int u=tpx[i];
        g[u]++;
        RepG(i,u){
            if(!is[i])continue;
            int v=e[i].to;
            g[u]+=g[v];
        }
    }
    Rep(i,1,m)
        if(is[i])
            ans[i]=(ans[i]+1ll*f[e[i].from]*g[e[i].to])%mod;
}

int main()
{
    memset(head,-1,sizeof(head));
    read(n),read(m);
    Rep(i,1,m){
        int x,y,c;
        read(x),read(y),read(c);
        add(x,y,c);
    }
    Rep(i,1,n){
        spfa(i);
        topo();
        update(i);
    }
    Rep(i,1,m)printf("%lld\n",ans[i]);
    return 0;
}
Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块) CloudScraper是一个专门用于绕过Cloudflare反机器人保护的Python库,它基于requests库构建,能够处理Cloudflare的5秒盾、WAF和人机验证等防护机制。 阅读详情

相关推荐

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

[bzoj2750][HAOI2012]Road

2750: [HAOI2012]RoadTime Limit: 10 Sec Memory Limit: 128 MB Submit: 397 Solved: 184 [Submit][Status][Discuss] DescriptionC国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当

Vampire 1452

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1974

【BZOJ 2752】 [HAOI2012]高速公路(road)

计数问题+线段树~

Regina8023 1822

别再手动算频谱了!用这个在线FFT工具,5分钟搞定JSON/CSV数据分析

本文介绍了一款高效的在线FFT工具,帮助用户快速分析JSON/CSV格式的时域数据,5分钟内完成频谱分析。通过傅里叶变换(FFT)算法,大幅提升计算效率,解决传统手动计算的痛点,适用于工业振动分析、设备故障诊断等场景。

weixin_29172201的博客 258

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 465

BZOJ 2752 [HAOI2012]高速公路(road)【线段树

一只又水又裸的线段树 然而flaze太naive于是重写了三次【【跪着望天 前两次算法比较naive……总之就是要求一波前缀和的前缀和,于是ver1写得丑哭,连亲妈flaze都看不下去只好重写,,第二次欢快地除了样例啥都不能过,胡搞乱搞调了半天发现自己前缀和的前缀和求跪了【望天】于是开了一晚上夜车又睡了一早上终于写了ver3……不禁感慨数学大法好…… 目测一下就发现每条道路对答案的贡献就是

Flaze_的博客 1096

SAP S/4 HANA CO 成本模块实战指南

摘要:SAP S/4HANA CO(管理会计)模块是企业内部成本管理的核心工具。本文系统介绍了CO模块的组织结构(控制范围与会计科目表映射)、基础概念(计划值与预算值)以及6大子模块功能(成本要素、成本中心会计等)。重点解析了各子模块的应用场景与差异,包括成本归集、费用分摊、利润分析和产品成本控制,并对比了利润中心与成本中心、内部订单与销售订单的区别。通过事务代码示例和功能对比表,帮助用户快速掌握SAP CO模块的核心管理逻辑与实施要点。

金牌架构师 1125

P2505 [HAOI2012] 道路 Solution

P2505 [HAOI2012] 道路 题解

pystraf的博客 903

手把手教你学AutoSAR - 总目录

鉴于近期较多博友问及微信群,如下可申请好友验证,请备注“autosar”,否则可能添加不通过。验证通过后,拉入讨论群。PS:本人鉴于工作事项可能不能及时回复问题,可在交流群内部和其他博友之间相互沟通交流经验。欢迎来到桃源乐游的《AutoSAR配置与实践》,以下为学习大纲,蓝色字体点击可跳转。

nihaoljq2010的博客 7458

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

一、基本概念CiteSpace(引文空间)是一款专注于分析科学分析中蕴含的潜在知识的软件。它是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。通过可视化的手段,CiteSpace能够呈现科学知识的结构、规律和分布情况,并因此将这种分析得到的可视化图形称为“科学知识图谱”。二、主要功能和用途知识图谱构建:根据科学文献的引用关系,CiteSpace可以生成知识图谱,帮助研究人员更好地理解学术领域中不同文献之间的联系和演化过程。主题聚类分析。

m0_64336780的博客 1万+

[HAOI2012]道路

题目描述 C国有n座城市,城市之间通过m条[b]单向[/b]道路连接。一条路径被称为最短路,当且仅当不存在从 它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多 少条不同的最短路经过该道路。现在,这个任务交给了你。 输入输出格式 输入格式: 第一行包含两个正整数n、m 接下来m行每...

aoanping0730的博客 241

Unreal5从入门到精通之Landscape地形系统

虚幻引擎 5 (UE5) 能够利用其强大的地形编辑工具套件创建大规模的地形世界。使用地形工具可以创建身临其境的户外地形,这些地形经过优化,可在多种不同设备上保持可播放的帧速率。

TxNet 4141

洛谷 P2505 [HAOI2012]道路 解题报告

P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。 输入输出格式 输入格式: 第一行包含两个正整数n、m 接下来m行每行包...

weixin_30952535的博客 351

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

P2505 [HAOI2012]道路

题目描述 C国有n座城市,城市之间通过m条[b]单向[/b]道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。 输入输出格式 输入格式: 第一行包含两个正整数n、m 接下来m行每行包含三个正整...

weixin_30635053的博客 217

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HAOI2012 道路

题目链接 戳我 最短路DAG上计数 经过点的最短路计数和经过边的最短路计数实在不能一概而论。。。。qwqwqwqwqwq 在做这道题之前,让我先捞上一张来自xyz32768大佬的图 对于一条边(x,y)——求S到x的最短路径个数是很好求的一件事,对于一条边两个端点u,v,sum[v]+=sum[u]。那么顺序应当怎么确定呢?拓扑排序啊!但是怎么保证正确性呢?没有环啊! 求上面那个好求,...

weixin_30664539的博客 106

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

解题:HAOI 2012 道路

题面 这题不开O2怎么过=。= 可能这种有关最短路的计数题做多了就有些感觉了...... 以每个点为基准跑出一张最短路图,然后对每个边$(u,v)$统计两个东西。一个$pre[u]$表示到达$u$这个起点的路径条数,一个$nxt[v]$表示从$v$开始的最短路数,然后对每条边来一下乘法原理。 然后是这两个玩意的统计方法,$pre[]$可以在最短路图上跑拓扑排序得出,$nxt[]$可以跑记忆...

weixin_30567471的博客 128

[HAOI2012]道路,洛谷P2505,最短路图

正题       这题还是挺好想的。       把每个点作为起点的最短路图建出来。       做一次拓扑排序,求起点到该点有多少条最短路图。       然后做一次反拓扑序,求出该点可以到达其他点的路径种数。       最后对于边,它的价值就是u的第一个价值乘上v的第二个价值。       相当于算的是以i为起点的最短路有多少条经过这条边。答案全部加起来就可以了。 #incl...

Deep_Kevin的娱乐空间 716

【BZOJ2750】【HAOI2012】道路(最短路+拓扑)

容易想到枚举所有起点 做最短路 然后枚举边统计次数 一条边(x,y)的贡献 肯定是 s到x最短路的方案数 乘上 s到其他点但经过了y的最短路 对于前者 每个点可以从前一个点递推过来 只要满足dis[vis]==dis[now]+edge[u].val 当一个点被所有入边都统计了一次后 就可以搜他了(拓扑思想) 对于后者 每个点从后一个点递推过来 #include<bits/stdc...

Android66666的博客 280

[HAOI2012]道路(最短路DAG上计数)

C国有n座城市,城市之间通过m条[b]单向[/b]道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。 Solution 我们要求每条边上最短路经过的数量,看上去非常不好求,但注意到点数只有1500,边数...

weixin_30443813的博客 113

BZOJ2750&&洛谷P2505 [HAOI2012]道路

毒瘤题 拓扑+SPFA+暴力枚举 枚举起点,跑SPFA求出dis[i] 然后每进行完一次SPFA,就枚举最短路图中的所有边---&gt;满足dis[fr]+cost=dis[to]的边就是最短路上的边,把这些边标记起来,构成一张最短路图,显然这张图上不存在环,因为不可能存在一条路径满足u-&gt;v-&gt;z-&gt;u,显然我们可以拓扑统计到达每个点的方案数 tot[to]+=tot[...

AcerMoOi之路 598

洛谷2505 [HAOI2012]道路(最短路计数)

洛谷传送门 【题目分析】 线段树?bczd,这么小的范围直接暴力就行啦。 直接O(n)枚举源点,每次跑最短路,然后对于每一条路径统计是否在最短路上、两个端点各有多少条最短路径经过即可。 【代码~】 #include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN=1e3+510; const int MAXM=1e4+1...

Michael_GLF的博客 234
上一篇: [SDOI2013] 随机数生成器
下一篇: Codeforces Round 627(div.3)
NephrenRuqInsania
博客等级 码龄8年 20粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值