1 条题解

  • 0
    @ 2026-6-14 9:03:15

    // 拓扑排序 O(n)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=105;
    vector<pair<int,int>> e[N];
    int n,m;
    int C[N],U[N],rd[N],cd[N];
    
    void topo(){
      queue<int> q;
      for(int i=1; i<=n; i++){
        if(rd[i]==0) q.push(i); //输入层的点均入队 
        else C[i]-=U[i]; //其他层先减阈值Ui(点权)
      } 
      while(!q.empty()){
        int u=q.front(); q.pop();
        for(auto [v,w]:e[u]){
          if(C[u]>0) C[v]+=C[u]*w; //如果u点能兴奋,则向v点发送信号C[u]
          if(--rd[v]==0) q.push(v);
        }
      }
    }
    int main(){
      cin>>n>>m; //n个神经元 m条边
      for(int i=1;i<=n;i++) cin>>C[i]>>U[i]; //每个点的最初状态和阈值
      for(int i=1,u,v,w; i<=m; i++){
        cin>>u>>v>>w; //从点u到点v的边权w
        e[u].emplace_back(v,w);
        cd[u]++; //u的出度+1
        rd[v]++; //v的入度+1
      }
      topo();
      
      bool ok=0;
      for(int i=1;i<=n;i++)if(!cd[i]&&C[i]>0){ //如果是输出层且状态>0的点
        cout<<i<<" "<<C[i]<<"\n",ok=1;
      }
      if(!ok) cout<<"NULL";
    }
    
    • 1

    D152 拓扑排序[NOIP提高组2003]神经网络

    信息

    ID
    633
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    15
    已通过
    9
    上传者