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

本文介绍了一种利用拓扑排序解决特定神经网络问题的方法。通过详细解析题目要求,构建了相应的图结构,并实现了拓扑排序算法来确定网络中各节点的有效权重。最后给出了完整的AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

在这里插入图片描述

拓扑排序简介

解题思路

AC代码

#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
    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 个数(快速幂)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值