Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <stack>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. #define maxn 200
  8. int n,p;
  9. int c[maxn];
  10. int U[maxn];
  11. int out_degree[maxn];
  12. int in_degree[maxn];
  13.  
  14.  
  15. /* ================= 向量星 =================*/
  16. int head[maxn];
  17. int edge_cnt = 0;
  18. struct _e{
  19. int u,v,w,next;
  20. }e[maxn<<1];
  21.  
  22. void inline xlx_init(){
  23. edge_cnt = 0;
  24. memset(head,-1,sizeof(head));
  25. }
  26.  
  27. void addEdge(int u,int v,int w){
  28. edge_cnt++;
  29. e[edge_cnt].u = u;
  30. e[edge_cnt].v= v;
  31. e[edge_cnt].w=w;
  32. e[edge_cnt].next = head[u];
  33. head[u] = edge_cnt;
  34. }
  35. /* ================= 向量星 end =================*/
  36.  
  37.  
  38. /* ================= 向量星2 =================*/
  39. int head2[maxn];
  40. int edge_cnt2 = 0;
  41. struct _e e2[maxn<<1];
  42.  
  43. void inline xlx_init2(){
  44. edge_cnt2 = 0;
  45. memset(head2,-1,sizeof(head2));
  46. }
  47.  
  48. void addEdge2(int u,int v,int w){
  49. edge_cnt2++;
  50. e2[edge_cnt2].u = u;
  51. e2[edge_cnt2].v= v;
  52. e2[edge_cnt2].w=w;
  53. e2[edge_cnt2].next = head2[u];
  54. head2[u] = edge_cnt2;
  55. }
  56. /* ================= 向量星 end =================*/
  57.  
  58.  
  59. struct kahn {
  60. stack<int> sta; //栈
  61. vector<int> in_degree;//每个点的入度
  62. vector<int> top_sort_list;
  63. int n; //点的数量
  64.  
  65. kahn(){}
  66. kahn(int node_c){
  67. n = node_c;
  68. in_degree.resize(node_c+1);
  69. }
  70.  
  71. void sort(){
  72. int i,j;
  73. for(i=1;i<=n;i++){ //默认点从1开始
  74. //把所有的入度为0的点加入
  75. if(in_degree[i] == 0)
  76. sta.push(i);
  77. }
  78.  
  79. while(!sta.empty()){
  80. int t = sta.top(); sta.pop();
  81. top_sort_list.push_back(t);
  82. for(i = head[t];i!=-1;i = e[i].next){
  83. int v =e[i].v;
  84. in_degree[v]--;
  85. if(in_degree[v] == 0)
  86. sta.push(v);
  87. }
  88. }
  89. }
  90.  
  91. };
  92.  
  93. void init(){
  94. }
  95.  
  96.  
  97.  
  98. int main(){
  99. xlx_init();
  100. xlx_init2();
  101.  
  102. scanf("%d%d",&n,&p);
  103. kahn ka(n);
  104.  
  105. int i;
  106. int t1,t2,t3;
  107. for (i=1;i<=n;i++){
  108. scanf("%d%d",&t1,&t2);
  109. c[i] = t1;
  110. U[i] = t2;
  111. }
  112. for (i=1;i<=p;i++){
  113. scanf("%d%d%d",&t1,&t2,&t3);
  114. addEdge(t1,t2,t3);
  115. addEdge2(t2,t1,t3);
  116. ka.in_degree[t2]++;//入度
  117. out_degree[t1]++;
  118. in_degree[t2]++;
  119. }
  120.  
  121. ka.sort();
  122.  
  123. //计算
  124. int j;
  125. for(i=0;i<(int)ka.top_sort_list.size();i++){
  126. /* 找前趋点 */
  127. int u = ka.top_sort_list[i];
  128. if( in_degree[u] == 0) //第一层的点不计算
  129. continue;
  130. for(j=head2[u];j!=-1;j=e2[j].next){
  131. int v = e2[j].v;
  132. if( c[v] > 0){
  133. int k = e2[j].w * c[v];
  134. c[u] +=k ;
  135. }
  136. }
  137. c[u] -= U[u];
  138. }
  139.  
  140. bool all_zero = true;
  141. for(i=1;i<=n;i++){
  142. if(out_degree[i] == 0 && c[i] != 0){
  143. all_zero = false;
  144. break;
  145. }
  146. }
  147.  
  148. if( all_zero)
  149. printf("NULL");
  150.  
  151. else {
  152. for(i=1;i<=n;i++){
  153. //if( out_degree[i] == 0)
  154. //printf("out %d\n",i);
  155. if(out_degree[i] == 0 && c[i] > 0){
  156. printf("%d %d\n",i,c[i]);
  157. }
  158. }
  159.  
  160. }
  161.  
  162.  
  163. return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement