题目

因此我们先分析一下题目的坑点。

1:

题目的图分为输入层,输出层,以及中间层。

我们怎么判断呢???可以判断每个点的入度及出度。如果一个点的入度为零则它是输入层,出度为零则是输出层。其余情况便是中间层。

因为根据原题所描述的

神经网络输出结果为nan 神经网络输出为0_i++

公式中的 神经网络输出结果为nan 神经网络输出为0_#include_02

神经网络输出结果为nan 神经网络输出为0_拓扑排序_03

神经网络输出结果为nan 神经网络输出为0_#include_04

神经网络输出结果为nan 神经网络输出为0_神经网络输出结果为nan_05

神经网络输出结果为nan 神经网络输出为0_i++_06

神经网络输出结果为nan 神经网络输出为0_神经网络输出结果为nan_07

神经网络输出结果为nan 神经网络输出为0_拓扑排序_08

神经网络输出结果为nan 神经网络输出为0_拓扑排序_09

神经网络输出结果为nan 神经网络输出为0_#include_10

神经网络输出结果为nan 神经网络输出为0_拓扑排序_11

神经网络输出结果为nan 神经网络输出为0_i++_12

神经网络输出结果为nan 神经网络输出为0_神经网络输出结果为nan_13

神经网络输出结果为nan 神经网络输出为0_拓扑排序_14

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
int n,m,in_degree[1000],out_degree[1000];
bool flag;
int tot,lin[100010];
int c[10010],u[1010],now[10000];//now是现在的状态值,并不是最终的。 
struct cym {
    int from,to,next,len;
} e[100010];
void add(int x,int y,int v)
{
    e[++tot].from=x;
    e[tot].to=y;
    e[tot].len=v;
    e[tot].next=lin[x];
    lin[x]=tot;
    in_degree[y]++;//判断是否是输出层和输入层及拓扑排序 
    out_degree[x]++;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d%d",&c[i],&u[i]);
    for(int i=1; i<=m; i++) {
        int x,y,v;
        scanf("%d%d%d",&x,&y,&v);
        add(x,y,v);
    }
    for(int i=1; i<=n; i++)
        if(!in_degree[i])//如果这个点是输入层他的状态是最先确定的,因此根据FIFO原则,用队列优化,也是拓扑排序的方法。 
            q.push(i);
    while(!q.empty()) {
        int cur=q.front();
        q.pop();
        //if(c[cur]<=0)加上这两句是不行的,因为要减去下文的入度 
        //continue; 
        for(int i=lin[cur]; i; i=e[i].next) 
        {
            in_degree[e[i].to]--;
            if(c[e[i].from]>0)//判断该点是否可以向下传递 
            now[e[i].to]+=c[e[i].from]*e[i].len;
            if(!in_degree[e[i].to])//当入度为零时说明所有先决条件都已满足,满足拓扑排序,可以入队 
            {
                now[e[i].to]-=u[e[i].to];//别忘了减去阈值 
                c[e[i].to]=now[e[i].to];
                q.push(e[i].to);
            }
        }
    }
    for(int i=1; i<=n; i++)
        if(out_degree[i]==0&&c[i]>0)//判断是否为输出层且最后状态>0 
        {
            flag=1;
            printf("%d %d\n",i,c[i]);
        }
    if(!flag)
        printf("NULL");
}