拓扑排序
int in[ MAXN] ;
void topsort ( ) {
queue < int > que;
for ( int i= 1 ; i<= n; i++ ) {
if ( ! in[ i] ) que. push ( i) ;
}
while ( ! que. empty ( ) ) {
int u = que. front ( ) ;
que. pop ( ) ;
for ( int k= head[ u] ; k; k= map[ k] . next) {
int v = map[ k] . to;
in[ v] -- ;
if ( ! in[ v] ) {
que. push ( v) ;
}
}
}
}
P1038 神经网络
#include <stdio.h>
#include <queue>
#include <iostream>
using namespace std;
#define MAXN 100005
int n, m, ct;
int c[ MAXN] , U[ MAXN] ;
int cnt;
int head[ MAXN] ;
struct node{
int from, to, next, w;
} map[ MAXN] ;
void add ( int u, int v, int w) {
map[ ++ cnt] = ( node) { u, v, head[ u] , w} ;
head[ u] = cnt;
}
int in[ MAXN] , out[ MAXN] ;
void topsort ( ) {
queue < int > que;
for ( int i= 1 ; i<= n; i++ ) {
if ( ! in[ i] ) que. push ( i) ;
}
while ( ! que. empty ( ) ) {
int u = que. front ( ) ;
que. pop ( ) ;
for ( int k= head[ u] ; k; k= map[ k] . next) {
int v = map[ k] . to;
int w = map[ k] . w;
c[ v] + = w* c[ u] ;
in[ v] -- ;
if ( ! in[ v] ) {
que. push ( v) ;
c[ v] - = U[ v] ;
if ( c[ v] <= 0 ) c[ v] = 0 ;
}
}
}
}
int main ( void )
{
cin >> n >> m;
for ( int i= 1 ; i<= n; i++ ) {
int x, y;
cin >> x >> y;
c[ i] = x;
U[ i] = y;
}
for ( int i= 1 ; i<= m; i++ ) {
int u, v, w;
cin >> u >> v >> w;
add ( u, v, w) ;
in[ v] ++ ;
out[ u] ++ ;
}
topsort ( ) ;
for ( int i= 1 ; i<= n; i++ ) {
if ( ! out[ i] && c[ i] > 0 ) {
cout << i << " " << c[ i] << endl;
ct = 1 ;
}
}
if ( ! ct) cout << "NULL" ;
return 0 ;
}