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

    洛谷 P1038 神经网络

    https://www.luogu.org/problemnew/show/P1038

    JDOJ 1278: [NOIP2003]神经网络 T1

    https://neooj.com:8082/oldoj/problem.php?id=1278

    题目请自点链接,太麻烦了。

    思路解析:

    一开始看这道题不是很难,想了想就去做,后来发现这题的坑点细节比较多,需要一一讲解处理。

    正解-拓扑排序。

    为什么要用拓扑排序呢?

    不知道大家怎么想,在做这道题之前,在我印象中用拓扑排序的题大概都长这样:

    A打败了B,B打败了D...等类似模型。

    所以我并没有深入地理解拓扑排序。

    所谓的拓扑排序,其实就是有向图拓展的一种序列。

    我们这道题给出了一个求和公式(说到求和公式,这需要数学知识,我一开始也看不懂,后来查了百科看了题解才勉强整明白...)

    说明每一个顶点的C值需要从上一个节点处递推。

    再结合这道题有向图的本体。

    自然而然地想出求拓扑序。

    拓扑排序的模板请大家自行参照水题学习,这道题需要有一点点变化(绝对不多!!

    AC 代码如下:

    #include<cstdio>
    #include<queue>
    #include<algorithm>
    using namespace std;
    queue<int> q;
    int n,p,cnt;
    int chudu[110],v[110],c[110];
    int tot,to[11000],val[11000],nxt[11000],head[110],from[11000];
    struct answer
    {
        int id,val;
    }ans[110];
    void add(int x,int y,int z)
    {
        to[++tot]=y;
        val[tot]=z;
        nxt[tot]=head[x];
        from[tot]=x;
        head[x]=tot;
    }
    bool cmp(answer a,answer b)
    {
        return a.id<b.id;
    }
    int main()
    {
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++)
        {
            int u;
            chudu[i]=0;
            scanf("%d%d",&c[i],&u);
            if(c[i])
            {
                q.push(i);
                v[i]=1;
            }
            else
                c[i]-=u;
        }
        for(int i=1;i<=p;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            chudu[x]=1;
        }
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(int i=head[x];i;i=nxt[i])
            {
                if(c[from[i]]<=0)
                    continue;
                int y=to[i];
                c[y]+=(val[i]*c[x]);
                if(v[y]==0)
                {
                    q.push(y);
                    v[y]=1;
                }
            }
        }
        for(int i=1;i<=n;i++)
            if(c[i]>0 && chudu[i]==0)
            {
                ans[++cnt].id=i;
                ans[cnt].val=c[i];
            }
        if(cnt==0)
        {
            printf("NULL");
            return 0;
        }
        sort(ans+1,ans+cnt+1,cmp);
        for(int i=1;i<=cnt;i++)
            printf("%d %d
    ",ans[i].id,ans[i].val);
        return 0;
    }

    我jio得大家应该能看懂。

  • 相关阅读:
    JAVA Oauth 认证服务器的搭建
    ibatis 中isNull, isNotNull与isEmpty, isNotEmpty区别
    Java OAuth开发包资料
    hOAuth2.0认证和授权原理
    Spring+Quartz实现定时任务的配置方法
    cron表达式详解(Spring定时任务配置时间间隔)
    spring定时任务的配置使用
    [spring-framework]Spring定时器的配置和使用
    net.sf.json在处理json对象转换为普通java实体对象时的问题和解决方案
    大数据和拉普拉斯妖
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11216978.html
Copyright © 2011-2022 走看看