拓扑排序用来解决什么问题,现在来看就是解决有图中的节点有先后顺序的问题。
板子题读懂题目后拓扑排序进行模拟即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,xx,yy,ww,cnt,fla;
ll ind[110];ll head[110];ll oud[110];
struct node1{
ll ci,ui;
}po[110];
struct node2{
ll next,y,w;
}ed[1010];
queue<ll>q;
void add(ll aa,ll bb,ll cc){
++cnt;
ed[cnt].y=bb;
ed[cnt].w=cc;
ed[cnt].next=head[aa];
head[aa]=cnt;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>po[i].ci>>po[i].ui;
}
for(int i=1;i<=m;++i){
cin>>xx>>yy>>ww;
add(xx,yy,ww);ind[yy]++;oud[xx]++;
}
for(int i=1;i<=n;++i){
if(ind[i]==0){q.push(i);}
}
while(!q.empty()){
ll u=q.front();q.pop();
if(po[u].ci>0){
for(int i=head[u];i;i=ed[i].next){
ll v=ed[i].y;ind[v]--;
po[v].ci+=ed[i].w*po[u].ci-po[v].ui;
if(ind[v]==0)q.push(v);
}}
}
for(int i=1;i<=n;++i){
if(po[i].ci>0&&oud[i]==0){
printf("%d %d\n",i,po[i].ci);
fla=1;
}
}
if(fla==0)printf("NULL\n");
return 0;
}