【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录

题目:最大食物链

解法一:

 解法二: 记忆化

题目:游走

思路: 


                

        

        

题目:最大食物链

        

解法一:

         

        

我们标记f[i]是被f[x]捕食的点对应的类食物链数

不难得出: f[x]=∑(f[i])   
首先从生产者开始,每去掉一个被捕食的点,那么相邻捕食者就要加上去掉点的类食物链数,但是我们还需要找到出度为0的消费者。
所以这道题,我们要同时记录入度,还有出度(其实单纯的topo排序就用不上出度,记录出度是为了找食物链结尾的个数)

      

        

#include<bits/stdc++.h> 
using namespace std;
const int MOD=80112002,M=500005,N=5005;
vector <int>v[N];
queue<int> q;
int n,m,ans,f[N],in[N],out[N];//我们需要标记每个点的入度和出度,f为以该点结尾的类食物链数
int main(){cin>>n>>m;int x,y;for(int i=1;i<=m;i++){cin>>x>>y;v[x].push_back(y);//y吃x,x指向yout[x]++;in[y]++;}for(int i=1;i<=n;i++){//找到所有没有入度的点为起点if(in[i]==0){q.push(i);f[i]=1;}}while(q.size()){//进行拓扑排序int cur=q.front();q.pop();for(int i=0,sz=v[cur].size();i<sz;i++){int t=v[cur][i];f[t]=(f[t]+f[cur])%MOD;in[t]--;//去掉cur点的话,就要把f[cur]加到捕食它的点上if(in[t]==0) q.push(t);}		}for(int i=1;i<=n;i++){if(out[i]==0)ans=(ans+f[i])%MOD;//出度为0的点的f是我们要的真正食物链数}cout<<ans;return 0;
}

        

        

 解法二: 记忆化


#include <bits/stdc++.h>    //记忆化搜索
using namespace std;
const int N=1e5+5;
int n,m,ans,tot,in[N],out[N],f[N];
vector<int>ve[N];
int dfs(int x){//就是从每个生产者开始,看看能到多少个最终消费者,然后记忆化,最终计算所有生产者就是答案if(f[x])return f[x];if(!out[x])return 1;for(int i=0,sz=ve[x].size();i<sz;i++){int v=ve[x][i];f[x]+=dfs(v);}return f[x];
}
int main(){cin>>n>>m;int u,v,w;while(m--){cin>>u>>v;ve[u].push_back(v);out[u]++;in[v]++;}for(int i=1;i<=n;i++){if(in[i]==0&&out[i])ans+=dfs(i);}cout<<ans;
}

        

        

题目:游走

         

思路: 

       

给一个DAG(有向无环图),求所走路径长度的期望呗!也就是:所有路径长度总和/所有路径个数(因为每条路径概率都一样嘛)

        

明明是DAG图,topo一下完事了

我们设置g[i]表示以i为终点的路径数,f[i]表示i为终点的长度和

   
topo:从点j到一个点i,则g[i]+=g[j],f[i]+=f[j]+g[i](因为啊,从j到i的每个路径长度都只增加1就行,一共增加了g[i])

        
最后就是求(L/S)MOD,也就是L*(S^(MOD-2))MOD即可(逆元小知识)

        

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;
const ll MOD=998244353;
int n,m;
ll L,S,f[MAXN],g[MAXN];//g[i]表示以i为终点的路径数,f[i]表示i为终点的长度和
vector<int> edge[MAXN];
int in[MAXN],vis[MAXN];
void topo(void)//模板
{queue<int> q;for(int i=1;i<=n;i++)if(!in[i]) q.push(i);while(!q.empty()){const int u=q.front();q.pop();if(vis[u]) continue; vis[u]=true;//没有环,所以这句话可以不要for(auto v:edge[u]){in[v]--;if(!in[v])	q.push(v);f[v]=(f[v]+f[u]+g[u])%MOD;g[v]=(g[v]+g[u])%MOD;}}
}ll qpow(ll base,ll k)//快速幂求逆元
{ll res=1;while(k){if(k&1)	res=res*base%MOD;base=base*base%MOD;k>>=1;}return res;
}int main()
{cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;edge[u].push_back(v);in[v]++;}for(int i=1;i<=n;i++)	g[i]=1;//初始化:每个点的路径数初始化为1topo();for(int i=1;i<=n;i++)	L=(L+f[i])%MOD;//获取最终的总长度for(int i=1;i<=n;i++)	S=(S+g[i])%MOD;//获取最终的路径个数cout<<(L*qpow(S,MOD-2))%MOD<<endl;//求L/S的结果,即L*S的逆元,即L*S^(MOD-2)return 0;
}

提一嘴: 

                    
为什么要引入逆元呢?
因为(a+b)%MOD=(a%MOD+b%MOD)%MOD
(a-b)%MOD=(a%MOD-b%MOD)%MOD
(a*b)%MOD=(a%MOD*b%MOD)%MOD  

            
但是除法不满足,我们要求(a/b)%p=1等价于(a*x)%p=1,这个x就是b的乘法逆元(可以理解成x为1/b),也就是(b*x)%p=1

        
再引入费马小定理:假如a和p互质,那么a^(p-1)=1(%p),故a*a^(p-2)=1(%p),故a的逆元x=a^(p-2)%p
因此:(x/y)%p等价于x*y^(p-2)%p,注意每乘一次就要去一次模
     

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

206 反转链表

解题思路可以有两种方法&#xff1a;递归 or 迭代。 \qquad 迭代&#xff1a;通过使用for循环遍历&#xff0c;完成目标。方法直观&#xff0c;容易理解。 \qquad 递归&#xff1a;通过函数调用其自身&#xff0c;完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

【数据结构】——栈|队列(基本功能)

目录 栈 基本概念 栈的常见基本操作 栈的存储 ✌栈的基本操作实现 栈的构建 栈的初始化 入栈 打印栈 出栈 获取栈顶元素 获取栈的有效元素个数 判断栈是否为空 销毁栈 队列 基本概念 队列的常见基本操作 ✌队列的基本操作实现 队列的构建 初始化 入队列 出…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09;中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

详解原生Spring当中的事务

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计&#xff0c;任意找一个配置器一直往上找&#xff0c;就会找到配置器的顶级接口&#xff1a;SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况&#xff1a; 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…

idea类和方法模版

类模版 修改目标位置 class #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java")/*** ${Description}* author whc ${YEAR}/${MONTH}/${DAY}* version v1.0 */public class ${NAME} { }inte…

【网络安全】虚假IP地址攻击如何防范?

在当今的网络时代&#xff0c;虚假IP地址攻击已成为一种新型的网络攻击方式&#xff0c;给网络安全带来了极大的威胁。那么&#xff0c;什么是虚假IP地址攻击&#xff1f;又如何进行溯源和防范呢&#xff1f;本文将为您揭开这一神秘面纱。 一、虚假IP地址攻击概述 虚假IP地址攻…

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行&#xff0c;然后 打开twenty_newsgroups.py文件&#xff08;在fetch_20newsgroups函数名上&#xff0c;右键转到定义即可找到&#xff09; 之后运行代码即…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

【初阶解法-数据结构】包含min函数的栈(代码+图示)

【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法 文章目录 【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法题目提炼题目要求分析题目总结思路代码时间/空间复杂度进阶版 题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函…

Ubuntu22.04 交叉编译mp4V2 for Rv1106

一、配置工具链环境 sudo vim ~/.bashrc在文件最后添加 export PATH$PATH:/opt/arm-rockchip830-linux-uclibcgnueabihf/bin 保存&#xff0c;重启机器 二、下载mp4v2 下载路径&#xff1a;MP4v2 | mp4v2 三、修改CMakeLists.txt 四、执行编译 mkdir build cd buildcmak…

羊大师教你如何在冬天运动,然后悄悄惊艳所有人

羊大师教你如何在冬天运动&#xff0c;然后悄悄惊艳所有人 寒冷的冬季&#xff0c;寂静的清晨&#xff0c;你是否也曾感到在冰冷的天气中进行锻炼是一件非常困难的事情&#xff1f;但是&#xff0c;现在请跟随小编羊大师一起来探索冬季秘密运动&#xff0c;让你在春节惊艳众人…

人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100

我们之前做的都是线性分类问题,那么需要一根线来分割类别,但是,如果出现了,环形数据,我们知道,在二维中我们就无法分割了,那么有没有什么办法分割呢? 实际上是有的,可以看到,我们可以把数据进行升维,可以看到,如果把数据升高到2维度以上,可以看到,神奇的一幕出现了,这个时候,因…

【Linux】进程控制--进程创建/进程终止/进程等待/进程程序替换/简易shell实现

文章目录 一、进程创建1.fork函数2.fork函数返回值3.写时拷贝4.fork常规用法5.fork调用失败的原因 二、进程终止1.进程退出码2.进程退出场景3.进程常见退出方法 三、进程等待1.为什么要进行进程等待2.如何进行进程等待1.wait方法2.waitpid方法3.获取子进程status4.进程的阻塞等…

价差后的几种方向,澳福如何操作才能盈利

在价差出现时&#xff0c;澳福认为会出现以下几种方向。 昂贵资产的贬值和便宜资产的平行升值。昂贵的资产贬值&#xff0c;而便宜的资产保持不变。昂贵资产的贬值和便宜资产的平行贬值&#xff0c;但昂贵资产的贬值速度更快&#xff0c;超过便宜资产。更贵的一对的进一步升值和…

7. 系统信息与系统资源

7. 系统信息与系统资源 1. 系统信息1.1 系统标识 uname()1.2 sysinfo()1.3 gethostname()1.4 sysconf() 2. 时间、日期2.1 Linux 系统中的时间2.1.1 Linux 怎么记录时间2.1.2 jiffies 的引入 2.2 获取时间 time/gettimeofday2.2.1 time()2.2.2 gettimeofday() 2.3 时间转换函数…

登录校验过滤器

会话技术 JWT令牌 过滤器Filter 拦截器 interceptor cookise package com.it.controller;import com.it.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

Android wifi连接和获取IP分析

wifi 连接&获取IP 流程图 代码流程分析 一、关联阶段 1. WifiSettings.submit – > WifiManager WifiSettings 干的事情比较简单&#xff0c;当在dialog完成ssid 以及密码填充后&#xff0c;直接call WifiManager save 即可WifiManager 收到Save 之后&#xff0c;就开…

新的 BLUFFS 攻击导致蓝牙连接不再私密

蓝牙是一种连接我们设备的低功耗无线技术&#xff0c;有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击&#xff0c;这些攻击被定义为 BLUFFS&#xff08;蓝牙转发和…