添加链接描述 如果入度为0则加入 连vis都不需要
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+9;
queue<int> q;
int arr[N],vis[N],in[N],out[N],u[N];
int w[N],e[N],ne[N],h[N],idx;
void add(int a,int b,int c){
w[idx]=c;
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
typedef pair<int,int> pii;
priority_queue<pii> heap;
int main(){
memset(h,-1,sizeof h);
int n,p;
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++){
scanf("%d%d",&arr[i],&u[i]);
if(arr[i]>0)q.push(i);
}
for(int i=1;i<=p;i++){
int x,y,val;
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
in[y]++;
out[x]++;
}
while(q.size()){
int x=q.front();
q.pop();
for(int i=h[x];~i;i=ne[i]){
int y=e[i];
in[y]--;
if(arr[x]>0)arr[y]+=w[i]*arr[x];
if(in[y]==0){
q.push(y);
arr[y]-=u[y];
}
}
}
bool ok=0;
for(int i=1;i<=n;i++){
if(out[i]==0&&arr[i]>0)cout<<i<<" "<<arr[i]<<endl,ok=1;
}
if(!ok)cout<<"NULL";
return 0;
}
|