zoukankan      html  css  js  c++  java
  • 「HAOI2016」食物链

    题目链接

    解题思路

    简单的DAG上DP即可。

    参考程序

    #include <bits/stdc++.h>
    using namespace std;
    
    const int Maxn = 100010;
    const int Maxm = 200010;
    struct edge {
    	int To, Next;
    };
    edge Edge[ Maxm ];
    int Start[ Maxn ], Used;
    int n, m, In[ Maxn ], Out[ Maxn ], Dp[ Maxn ], L, R, Queue[ Maxn ], Count[ Maxn ];
    
    inline void AddEdge( int x, int y ) {
    	Edge[ ++Used ] = ( edge ) { y, Start[ x ] };
    	Start[ x ] = Used;
    	return;
    }
    
    int main() {
    	scanf( "%d%d", &n, &m );
    	for( int i = 1; i <= m; ++i ) {
    		int x, y; scanf( "%d%d", &x, &y );
    		AddEdge( x, y );
    		++In[ y ]; ++Out[ x ];
    	}
    	for( int i = 1; i <= n; ++i )
    		if( !In[ i ] ) {
    			Dp[ i ] = 1;
    			Queue[ ++R ] = i;
    		}
    	memcpy( Count, In, sizeof( Count ) );
    	while( L < R ) {
    		int u = Queue[ ++L ];
    		for( int t = Start[ u ]; t; t = Edge[ t ].Next ) {
    			int v = Edge[ t ].To;
    			Dp[ v ] += Dp[ u ];
    			if( --In[ v ] == 0 ) Queue[ ++R ] = v;
    		}
    	}
    	int Ans = 0;
    	for( int i = 1; i <= n; ++i ) 
    		if( Count[ i ] && !Out[ i ] ) Ans += Dp[ i ];
    	printf( "%d
    ", Ans );
    	return 0;
    }
    
    
  • 相关阅读:
    Go标准库之tar
    redis必知必会
    GORM CRUD指南
    GORM入门指南
    MUI中tap点击事件点击一次连续申请两次
    Go代码启动默认浏览器
    Go实现JWT
    Go Micro
    protobuf初识
    英语作文
  • 原文地址:https://www.cnblogs.com/chy-2003/p/11244488.html
Copyright © 2011-2022 走看看