NOIP2003 神经网络

来源:互联网 发布:电脑打字软件叫什么 编辑:程序博客网 时间:2024/05/13 05:20

题目:http://www.luogu.org/problem/show?pid=1038#
分析:以拓扑序进行bfs。我就说两点,只有f[i]>0时才会传递给子节点,只输出大于0的无解要输出NULL!
代码:

#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <vector>using namespace std;const int Tmax=105,Tmax2=2505;struct edge{    int v;    long long int w;};edge E[Tmax2];int n,m,in[Tmax];long long int u[Tmax],f[Tmax];bool ok=false;queue<int> Q;vector<int> G[Tmax];void bfs(){    int i,x,len,vv;    for(i=1;i<=n;i++)      if(f[i]!=0) Q.push(i);      else f[i]=-u[i];    while(!Q.empty())    {        x=Q.front();        Q.pop();        len=G[x].size();        if(f[x]<=0) continue;        for(i=0;i<len;i++)        {            vv=E[G[x][i]].v;            f[vv]+=E[G[x][i]].w*f[x];            in[vv]--;            if(in[vv]==0) Q.push(vv);        }    }    return;}int main(){    int i,a;    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)        scanf("%lld%lld",&f[i],&u[i]);    for(i=1;i<=m;i++)    {        scanf("%d%d%lld",&a,&E[i].v,&E[i].w);        G[a].push_back(i);        in[E[i].v]++;    }    bfs();    for(i=1;i<=n;i++)      if(G[i].size()==0&&f[i]>0){        printf("%d %lld\n",i,f[i]);        ok=true;      }    if(!ok) printf("NULL\n");    return 0;}
0 0
原创粉丝点击