洛谷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;
}

反正就很水的题因为我脑瘫,拖了这么久,最后还需要写个博客纪念一下。。。

posted @ 2021-09-03 20:41  little_sheep_xiaoen  阅读(64)  评论(0编辑  收藏  举报