zoukankan      html  css  js  c++  java
  • P1038 神经网络

    神经网络


    坑点

    • !负数 == true
    • 当一个点的C值大于0时,才能向下传递C * W 的值
    • 第一层(输入层)的点如果C大于0可直接向下传递,不需C -= U;

    解法

    按照拓扑序依次删边,如果C值大于零向下传递能量,最后输出最后一层(输出层)的信息;


    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 1e5 + 1;
    
    struct Node{
    	int v;
    	int w;
    	int nxt;
    }edge[N<<2];
    
    int n,p,top,pp;
    int U[N],C[N],rudu[N],head[N];
    
    void addedge(int u, int v, int w){
    	edge[++top].v = v;
    	edge[top].w = w;
    	edge[top].nxt = head[u];
    	head[u] = top;
    	rudu[v]++;
    }
    
    queue<int> q;
    void BFS_del(){
    	for(int i = 1; i <= n; ++i) if(!rudu[i]) q.push(i);
    	while(!q.empty()){
    		int u = q.front(); q.pop();
    		if(C[u] > 0 && !head[u]){ ++pp; continue; }
    		for(int i = head[u]; i; i = edge[i].nxt){
    			int v = edge[i].v;
    			int w = edge[i].w;
    			rudu[v]--;
    			if(C[u] > 0) C[v] += w * C[u];
    			if(!rudu[v]) C[v] -= U[v], q.push(v);
    		}
    	}
    	
    }
    
    int main(){
    	cin >> n >> p;
    	for(int i = 1; i <= n; ++i) cin >> C[i] >> U[i];
    	for(int i = 1, u, v, w; i <= p; ++i){
    		cin >> u >> v >> w;
    		addedge(u, v, w);
    	}
    	BFS_del();
    	if(pp == 0){ cout << "NULL" << endl; return 0; } 
    	for(int u = 1; u <= n; ++u)
    		if(!head[u] && C[u] > 0)
    			cout << u << " " << C[u] << endl;
    	return 0;
    }
    
  • 相关阅读:
    webpack详解
    扩展运算符及其在vuex的辅助函数里的应用详解
    react组件间传值详解
    类的构造函数(3)
    类构造函数(4)
    new delete
    类的构造函数(1)
    类的构造函数(2)
    类的继承(1)
    静态成员数据与函数
  • 原文地址:https://www.cnblogs.com/Adventurer-H/p/11274089.html
Copyright © 2011-2022 走看看