【洛谷】P1038 [NOIP2003 提高组] 神经网络(拓扑排序)

神经网络题解

    • 题目描述
    • 拓扑排序简介
    • 解题思路
    • AC代码
    • 上一篇博客:[【牛客网】序列的第 k 个数(快速幂)](https://blog.csdn.net/IAMLSL/article/details/114586125)

题目描述

拓扑排序简介

解题思路

AC代码

#include
#include
#include
#include
    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;
    }

上一篇博客:【牛客网】序列的第 k 个数(快速幂)

你可能感兴趣的:(算法刷题,NOIP,图论,算法,拓扑排序,题解)