博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HAOI2016]食物链
阅读量:6236 次
发布时间:2019-06-22

本文共 1137 字,大约阅读时间需要 3 分钟。

OJ题号:BZOJ4562、洛谷3183

思路:记忆化搜索。

本体可以转化成“求有向图中入度为0的结点到出度为0的结点的路径数”。

每次加边时记录每个结点的入度和出度,然后从入度为0的结点开始搜索,搜到出度为0的结点。

搜索到越底层,重复的路径越多,所以就要用记忆化的思想,将每个结点出发的路径个数记录下来,第二次搜到时直接调用。

1 #include
2 #include
3 const int N=100001; 4 std::vector
e[N]; 5 int in_degree[N]={
0}; 6 void add_edge(const int a,const int b) { 7 e[a].push_back(b); 8 in_degree[b]++; 9 }10 bool isroot(const int x) {11 return !in_degree[x];12 }13 bool isleaf(const int x) {14 return !e[x].size();15 }16 int f[N]={
0};17 int dfs(const int x) {18 if(f[x]) return f[x];19 if(isleaf(x)) return f[x]=1;20 int ans=0;21 for(int i=0;i<(int)e[x].size();i++) {22 ans+=dfs(e[x][i]);23 }24 return f[x]=ans;25 }26 int main() {27 int n,m;28 scanf("%d%d",&n,&m);29 for(int i=1;i<=m;i++) {30 int a,b;31 scanf("%d%d",&a,&b);32 add_edge(a,b);33 }34 int ans=0;35 for(int i=1;i<=n;i++) {36 if(isroot(i)&&!isleaf(i)) ans+=dfs(i);37 }38 printf("%d\n",ans);39 return 0;40 }

 

转载于:https://www.cnblogs.com/skylee03/p/6930464.html

你可能感兴趣的文章
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
我的友情链接
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>