【解题报告】洛谷P1038 神经网络
题目链接
https://www.luogu.com.cn/problem/P1038
思路
一看,就是拓扑排序
这个相当于拓扑排序的板子题目吧qaq
然后我们就直接做了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <queue> #define int long long using namespace std; const int maxn=105; struct edge{ int e,next,val; }ed[maxn*maxn]; int en,first[maxn]; void add_edge(int s,int e,int val) { en++; ed[en].next=first[s]; first[s]=en; ed[en].e=e; ed[en].val=val; } int n,p; int C[maxn],U[maxn]; int st[maxn]; bool vis[maxn],out[maxn]; queue <int> q; signed main() { cin>>n>>p; for(int i=1;i<=n;i++) { vis[i]=out[i]=false; cin>>C[i]>>U[i]; if(C[i]>0) { q.push(i); vis[i]=true; } else C[i]-=U[i]; } for(int i=1;i<=p;i++) { int x,y,z; cin>>x>>y>>z; add_edge(x,y,z); out[x]=true; } while(q.size()) { int x=q.front(); q.pop(); if(C[x]<0) continue; for(int i=first[x];i;i=ed[i].next) { int e=ed[i].e; int val=ed[i].val; C[e]+=(val*C[x]); if(!vis[e]) { vis[e]=true; q.push(e); } } } bool flag=false; for(int i=1;i<=n;i++) { if(!out[i]&&C[i]>0) { flag=true; cout<<i<<" "<<C[i]<<'\n'; } } if(!flag) cout<<"NULL"<<'\n'; return 0; }
|