洛谷P1038 神經網路
阿新 • • 發佈:2019-02-02
題解:
拓撲排序,難度挺低,但是細節很多。
其中一個注意點:c[i]即便是負數,也要進隊,不然有些點入度始終大於0,更新不了
標程:
#include<bits/stdc++.h>
using namespace std;
struct kk{
int x,y;
}a[103];
struct node{
int to,ne,w;
}e[10003];
int n,m,i,j,x,y,z,num,out[103],in[103],u,q[103],c[103],U[103],head[103],tot,h,t,v;
void add(int x,int y,int z){
e[++tot]=(node){y,head[x],z};
head[x]=tot;
}
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++){
scanf("%d%d",&c[i],&U[i]);
if (c[i]) q[++t]=i;
}
for (i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
in[y]++;out[x]++;
add(x,y,z);
}
while (h<t){
u=q[++h];
for (i=head[u];i;i=e[i].ne){
v=e[i].to;
if (c[u]>0) c[v]+=e[i].w*c[u];
in[v]--;
if (!in[v]) c[v]-=U[v],q[++t]=v;
}
}
for (i=1;i<=n;i++)
if (!out[i] && c[i]>0) num++,printf("%d %d\n",i,c[i]);//出度為0的就是輸出層
if (!num) printf ("NULL");
}