题目分析:
非入度为0的点,初始的
c
[
i
]
−
=
U
c[i]-=U
c [ i ] − = U 从入度为0的点拓扑,如果
c
[
i
]
>
0
c[i]>0
c [ i ] > 0 ,才往下传数据,但如果
c
[
i
]
<
=
0
c[i]<=0
c [ i ] < = 0 ,还是会
−
−
d
u
[
v
]
--du[v]
− − d u [ v ] ,而不是直接
c
o
n
t
i
n
u
e
continue
c o n t i n u e 输出出度为0的点的
c
[
i
]
c[i]
c [ i ] ,如果
c
[
i
]
<
=
0
c[i]<=0
c [ i ] < = 0 ,则不会输出数据,就不输出
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 110
#define maxm 10010
int st[ maxn] , top= 0 , size= 0 , head[ maxn] , du[ maxn] , n, m, c[ maxn] , U[ maxn] , can[ maxn] , cnt= 0 ;
struct edge {
int v, w, nxt;
} e[ maxm] ;
inline void init_ ( ) {
freopen ( "a.txt" , "r" , stdin ) ;
}
inline int read_ ( ) {
int x= 0 , f= 1 ;
char c= getchar ( ) ;
while ( c< '0' || c> '9' ) {
if ( c== '-' ) f= - 1 ;
c= getchar ( ) ;
}
while ( c>= '0' && c<= '9' ) {
x= ( x<< 3 ) + ( x<< 1 ) + c- '0' ;
c= getchar ( ) ;
}
return x* f;
}
inline void clean_ ( ) {
memset ( head, - 1 , sizeof ( head) ) ;
memset ( du, 0 , sizeof ( du) ) ;
}
inline void add_ ( int u, int v, int w) {
e[ ++ size] . v= v;
e[ size] . w= w;
e[ size] . nxt= head[ u] ;
head[ u] = size;
}
inline void topu_ ( ) {
int t= 0 ;
while ( t< top) {
int u= st[ ++ t] ;
if ( c[ u] <= 0 ) {
for ( int i= head[ u] ; ~ i; i= e[ i] . nxt) {
int v= e[ i] . v;
-- du[ v] ;
if ( ! du[ v] ) st[ ++ top] = v;
}
continue ;
}
for ( int i= head[ u] ; ~ i; i= e[ i] . nxt) {
int v= e[ i] . v, w= e[ i] . w;
c[ v] + = w* c[ u] ;
-- du[ v] ;
if ( ! du[ v] ) st[ ++ top] = v;
}
}
int pd= 0 ;
for ( int i= 1 ; i<= n; ++ i) {
if ( head[ i] == - 1 ) {
if ( c[ i] != 0 ) {
pd= 1 ;
break ;
}
}
}
if ( ! pd) printf ( "NULL" ) ;
else {
for ( int i= 1 ; i<= n; ++ i) {
if ( head[ i] == - 1 && c[ i] > 0 ) {
printf ( "%d %d\n" , i, c[ i] ) ;
}
}
}
}
void readda_ ( ) {
n= read_ ( ) ; m= read_ ( ) ;
clean_ ( ) ;
for ( int i= 1 ; i<= n; ++ i) {
c[ i] = read_ ( ) ; U[ i] = read_ ( ) ;
}
int x, y, z;
for ( int i= 1 ; i<= m; ++ i) {
x= read_ ( ) ; y= read_ ( ) ; z= read_ ( ) ;
add_ ( x, y, z) ;
++ du[ y] ;
}
for ( int i= 1 ; i<= n; ++ i) {
if ( ! du[ i] ) st[ ++ top] = i;
else c[ i] - = U[ i] ;
}
topu_ ( ) ;
}
int main ( ) {
init_ ( ) ;
readda_ ( ) ;
return 0 ;
}