题目意思比较明确,就是简单的拓扑排序,这里写几个图操作需要注意的坑点。
这里的边权值可能为正、负数,还可能为0,所以判断两个点之间是否有路径时要注意。
#include<bits/stdc++.h>
using namespace std;
int ui[110],ci[110],wi[110][110],n,p,inedge[110];
bool isconect[110][110];
vector<int> v;
queue<int> q;
int main()
{
cin>>n>>p;
for(int i=1;i<=n;++i)
{
cin>>ci[i]>>ui[i];
if(ci[i]) ui[i]=0;
}
for(int i=1;i<=p;++i)
{
int x,y;
cin>>x>>y;
cin>>wi[x][y];
isconect[x][y]=true;
++inedge[y];
}
for(int i=1;i<=n;++i)
{
if(ci[i])
q.push(i);
}
while(!q.empty())
{
int now=q.front();
q.pop();
ci[now]-=ui[now];
int flag=0;
for(int i=1;i<=n;++i)
{
if(isconect[now][i])
{
if(ci[now]>0) ci[i]+=ci[now]*wi[now][i];
--inedge[i];
if(!inedge[i]) q.push(i);
flag=1;
}
}
if(!flag) v.push_back(now);
}
int flag=0;
for(auto c:v)
{
if(ci[c]>0)
{
cout<<c<<' '<<ci[c]<<endl;
flag=1;
}
}
if(!flag) cout<<"NULL"<<endl;
return 0;
}