BZOJ4011(DP)
2016-03-04 22:29
204 查看
思路:
首先遇到问题我们如果不能一眼看出题解的话。尽量先去掉一些苛刻条件,简化问题看看会不会写 再考虑一下多了那个条件以后怎么写。
这题可以先吧多增加一条边去掉想想,在接着考虑加进来怎么办?
不会的话可以看PoPoQQQ的题解,很清楚。
首先遇到问题我们如果不能一眼看出题解的话。尽量先去掉一些苛刻条件,简化问题看看会不会写 再考虑一下多了那个条件以后怎么写。
这题可以先吧多增加一条边去掉想想,在接着考虑加进来怎么办?
不会的话可以看PoPoQQQ的题解,很清楚。
/* 首先还是比较容易想到第一层 先不考虑加边的情况 这时候ans=pai(degree[i]) (2<=i<=n); 但是加边以后可能会出现不合法的情况 就是成环 这时候想办法统计出所有不合法的情况 具体来说就是sigma(所有的S(pai(degree[i])(2<=i<=n && i不属于S))) //定义S为一条y->x的路径的点集; 然后进行动态规划 f[i]表示到y->i的上式 f[i]=sigma(所有j->i的S(f[j]))/degree[i];//因为此时i的连边情况已经确定 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<vector> using namespace std; typedef long long LL; const int imax=100000+229; const int bmax=200000+229; const int mod=1e9+7; int n,m,y,x; int head[imax],num,to[bmax],inext[bmax]; int degree[imax],d[imax]; LL ans,inv[bmax],f[imax]; void add(int u,int v){ to[num]=v; inext[num]=head[u]; head[u]=num++; } void iread() { scanf("%d%d%d%d",&n,&m,&x,&y); int a,b; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); add(a,b); degree[b]++; d[b]++; } degree[y]++; ans=1; for(int i=2;i<=n;i++) ans=(ans*degree[i])%mod; } LL ipow(LL base,int k) { LL sans=1; while(k) { if(k&1) sans=(sans*base)%mod; base=(base*base)%mod; k>>=1; } return sans; } void pre(){ for(int i=1;i<=m+1;i++) inv[i]=ipow(i,mod-2); } vector<int> q; void iwork() { pre(); if(y==1) { printf("%lld\n",ans); return;}//记得加特判 for(int i=1;i<=n;i++) if(!d[i]) q.push_back(i); //由于是拓扑图 不能直接加入1,看样例 f[y]=ans; // 由于y是起始点 不需要除以他的入度 while(!q.empty()) { int u=q.back(); q.pop_back(); f[u]=(f[u]*inv[degree[u]])%mod; for(int i=head[u];i!=-1;i=inext[i]) { int v=to[i]; f[v]=(f[v]+f[u])%mod; --d[v]; if(!d[v]) q.push_back(v); } } printf("%lld\n",(ans-f[x]+mod)%mod); } int main() { iread(); iwork(); return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow