博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4011 HNOI2015落忆枫音(动态规划+拓扑排序)
阅读量:5033 次
发布时间:2019-06-12

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

  DAG中每个点选一条入边就可以构成一棵有向树,所以如果没有环答案就是∏degreei

  考虑去掉含环的答案。可以看做把环缩点,剩下的点仍然可以任意选入边。于是去除的方案数即为∏degreei/∏degreek,k为环上点。

  环相当于考虑新加入边的终点到起点的所有路径。设f[i]为i为起点的所有路径提供的上述贡献,则f[i]=Σf[k]/degree[i]。拓扑排序之后dp即可。

#include
#include
#include
#include
#include
#include
using namespace std;int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}#define N 100010#define M 200010#define P 1000000007int n,m,p[N],u,v,degree[N],d[N],f[N],q[N],inv[N],t=0,ans=1;struct data{ int to,nxt;}edge[M];void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}void topsort(){ int head=0,tail=1;q[1]=1;memcpy(d,degree,sizeof(degree));d[v]--; while (tail
=1;i--) { for (int j=p[q[i]];j;j=edge[j].nxt) f[q[i]]=(f[q[i]]+f[edge[j].to])%P; f[q[i]]=1ll*f[q[i]]*inv[degree[q[i]]]%P; } cout<<(ans-f[v]+P)%P; return 0;}

 

转载于:https://www.cnblogs.com/Gloid/p/9820143.html

你可能感兴趣的文章
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
js随机数的取整
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
txmpp
查看>>