【NOIP2003 提高组 T1 神经网络】

来源:互联网 发布:ubuntu 安装 ssh 编辑:程序博客网 时间:2024/05/27 00:37

Solution

拓扑。
tips:
1.最后输出要输出c[i]>0的
2.if (c[i]>0) 要在里面判断 不然会少进,WA了无数次
之前就把注释处的写在了循环处。。

        for (int i=x;i<y;i++)        {            for (int j=Head[q[i]];j;j=edge[j].next)            {                int v=edge[j].v,w=edge[j].w;                if (c[q[i]]>0) c[v]+=w*c[q[i]];  //!!!                d[v]--;                if (!d[v]) q[tail++]=v;            }            if (!Head[q[i]] && c[q[i]]>0) ans[++num]=q[i];        }

CODE

#include<bits/stdc++.h>using namespace std;const int MAXN=205;int u[MAXN],c[MAXN],q[MAXN],d[MAXN],Head[MAXN],ans[MAXN];int n,m,num,tot,head,tail,x,y,z;struct Edge{    int next,v,w;}edge[MAXN*MAXN];void add_edge(int x,int y,int z){    tot++; d[y]++;    edge[tot]=(Edge){Head[x],y,z};    Head[x]=tot;}int main(){    scanf("%d%d",&n,&m);    head=tail=0;    for (int i=1;i<=n;i++)        {            scanf("%d%d",&c[i],&u[i]);            if (c[i]==0) c[i]-=u[i];            else q[tail++]=i;        }    for (int i=1;i<=m;i++)        scanf("%d%d%d",&x,&y,&z),add_edge(x,y,z);    while (head<tail)    {        int x=head,y=tail;        for (int i=x;i<y;i++)        {            for (int j=Head[q[i]];j;j=edge[j].next)            {                int v=edge[j].v,w=edge[j].w;                if (c[q[i]]>0) c[v]+=w*c[q[i]];                 d[v]--;                if (!d[v]) q[tail++]=v;            }            if (!Head[q[i]] && c[q[i]]>0) ans[++num]=q[i];        }        head=y;    }    sort(ans+1,ans+1+num);    if (num==0) printf("NULL\n");    else for (int i=1;i<=num;i++) printf("%d %d\n",ans[i],c[ans[i]]);    //system("pause");    return 0;}
原创粉丝点击