洛谷P4017 最大食物链数量 dfs
老规矩,传送门
做题从头到尾的思路:
1. 这个题明显就是dfs数数量了,简单,邻接矩阵干他!
TLE警告,8个点
额。。。
2. 老师说这玩意不能邻接矩阵?没事,还有邻接表,再来!
再次TLE 8个点
3. 我打记忆化搜索!
没有TLE,WA 8个点
4. 不开long long见祖宗。。。
WA 6个点
5. 得出结论,偷懒失败,打前向星吧。。。。
“你通过了此题 恭喜!”
。。。
恭喜。。。
好了,正经一点,来说这个题。
这个题是我刚学图论,dfs的时候开始做的,中间还放了很久,前几天清理未通过题的时候想起来的做完的,整个过程还是比较艰辛的。。。
读一遍题,就这个题就是简单的dfs,
再看一眼,有向图
看一眼数据范围,邻接矩阵邻接表都不能用,那用啥?
前向星啊!
#include<iostream> #include<cstdio> #define ll long long #define NUM 500010 #define INF 80112002 using namespace std; inline void read(int &x){ x=0;int fh=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-'){ fh=-1; } ch=getchar(); } while(isdigit(ch)){ x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } x*=fh; } struct bian{ int to,next; }; bian e[NUM]; int n,m,cnt; unsigned ll ans; ll gu[NUM]; ll cnta = 0; bool id[NUM],c[NUM]; int head[NUM]; ll s( int t ){ if( !id[t] ) return 1; if( gu[t] ) return gu[t]; ll lin = 0; for( int i = head[t];i;i = e[i].next ){ int p = e[i].to; lin = (s( p ) + lin) % INF; } gu[t] = lin; return lin; } void cun( int x,int y ){ e[++cnt].next = head[x]; e[cnt].to = y; head[x] = cnt; } int main(){ read(n);read(m); for( int i = 1;i <= m;i++ ){ int x,y; read(x);read(y); c[y]++;//入度 id[x]++; cun( x,y ); } for( int i = 1;i <= n;i++ ){ if( c[i] == 0 ) ans = ( ans + s(i) ) % 80112002; } cout << ans; }
反正就很水的题因为我脑瘫,拖了这么久,最后还需要写个博客纪念一下。。。