拓扑排序
适用:有向无环图 使用情景:每个项目有自己的前置任务 复杂度O{N+E} 代码(noip神经网络)
# include <queue>
# include <cstdio>
# include <algorithm>
# define N 101
using namespace std;
struct edge {
int to, val, nxt;
} e[ N* N] ;
struct answer {
int id, val;
} ans[ N] ;
int h, i, m, n, t, u, v, w, U, c[ N] , hd[ N] , out[ N] , vis[ N] ;
queue < int > q;
int cnt= 0 , flag= 0 ;
inline bool cmp ( answer aa, answer bb)
{ return aa. id< bb. id; }
inline void build ( int u, int v, int w)
{
cnt++ ;
e[ cnt] . to= v;
e[ cnt] . val= w;
e[ cnt] . nxt= hd[ u] ;
hd[ u] = cnt;
}
int main ( )
{
scanf ( "%d%d" , & n, & m) ;
for ( i= 1 ; i<= n; i++ )
{
vis[ i] = out[ i] = 0 ;
scanf ( "%d%d" , & c[ i] , & U) ;
if ( c[ i] > 0 )
{ q. push ( i) ; vis[ i] = 1 ; }
else c[ i] -= U;
}
for ( i= 1 ; i<= m; i++ )
{
scanf ( "%d%d%d" , & u, & v, & w) ;
build ( u, v, w) ;
out[ u] = 1 ;
}
while ( ! q. empty ( ) )
{
h= q. front ( ) ; q. pop ( ) ;
if ( c[ h] <= 0 ) continue ;
for ( i= hd[ h] ; i; i= e[ i] . nxt)
{
t= e[ i] . to;
c[ t] += e[ i] . val* c[ h] ;
if ( ! vis[ t] )
{
q. push ( t) ;
vis[ t] = 1 ;
}
}
}
for ( i= 1 ; i<= n; i++ )
if ( ! out[ i] && c[ i] > 0 )
{ printf ( "%d %d\n" , i, c[ i] ) ; flag= 1 ; }
if ( ! flag) { puts ( "NULL" ) ; return 0 ; }
return 0 ;
}