题目描述

拓扑排序简介
解题思路
AC代码
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
const int N=150;
int C[N],U[N],In[N],Out[N],input[N];
int n,p;
struct edge{
int v,w;
edge(int _v,int _w) : v(_v) , w(_w){}
};
vector<edge>E[N];
queue<int>q;
bool topsort(){
int cot=0;
for(int i=1;i<=n;i++)
{
if(In[i]==0) {
q.push(i);
input[i]=1;
}
if(Out[i]==0) cot++;
}
while(!q.empty()){
int u=q.front();
q.pop();
if(input[u]==0) C[u]-=U[u];
if(C[u]==0&&Out[u]==0) cot--;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
int w=E[u][i].w;
In[v]--;
if(In[v]==0) q.push(v);
if(C[u]>0) C[v]+=w*C[u];
}
}
return cot==0;
}
int main(){
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
scanf("%d%d",&C[i],&U[i]);
for(int i=1;i<=p;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
E[u].push_back(edge(v,w));
Out[u]++;
In[v]++;
}
if(topsort()) printf("NULL");
else{
for(int i=1;i<=n;i++)
if(Out[i]==0&&C[i]>0) printf("%d %d\n",i,C[i]);
}
return 0;
}