首页 > 代码库 > vijos1105 神经网络

vijos1105 神经网络

  主要就是一个拓扑排序,每次找到一个入度为零的点,然后更新别的点的C值。

#include<cstdio>
#include<cctype>
#include<vector>
using namespace std;
inline int read(){
    char c; while(c=getchar(),!isdigit(c) && c!=-);
    int x=0,y=1; if(c==-) y=-1; else x=c-0;
    while(c=getchar(),isdigit(c)) x=x*10+c-0; return x*y;
}
struct edge{
    int to,dis;
    edge(int to,int dis):to(to),dis(dis){}
};
int q[201],C[201],g[201],U[201],h,vis[201],t,ppp[201];
vector<edge> e[201];
int main(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++){
        C[i]=read(); U[i]=read();
        if(C[i]) ppp[i]=1;
    }
    for(int i=1;i<=m;i+=1){
        int u=read(),v=read(),dis=read();
        e[u].push_back(edge(v,dis));
        g[v]++;
    }
    for(int i=1;i<=n;i+=1){
        int o=0;
        for(int j=1;j<=n;j+=1)
            if(g[j]==0 && !vis[j]){o=j; break;}
        vis[o]=1;
        if(!ppp[o]) C[o]-=U[o];
        if(C[o]>0)
        for(int j=0;j<e[o].size();j+=1)
            g[e[o][j].to]--,C[e[o][j].to]+=C[o]*e[o][j].dis;
    }
    int tot=0;
    for(int i=1;i<=n;i+=1)
        if(e[i].empty() && C[i]>0) tot+=1,printf("%d %d\n",i,C[i]);
    if(tot==0) printf("NULL");
    return 0;
}

 

vijos1105 神经网络