1. 程式人生 > >vijos1105 神經網絡

vijos1105 神經網絡

== 每次 div std turn getchar() digi () return

  主要就是一個拓撲排序,每次找到一個入度為零的點,然後更新別的點的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 神經網絡