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得大家应该能看懂。

  • 相关阅读:
    你必须用角色管理工具安装Microsoft .NET Framework 3.5
    LINQ 小心Access to modified closure 问题
    .net BCL获取所有磁盘的信息
    对象的序列化和反序列化及其实现和使用
    对于CSDN博客文章不能爬取的问题
    IO与文件读写Java的IO流架构
    对象的深复制与浅复制 实现Cloneable接口实现深复制 序列化实现深复制
    博客园文章爬取代码
    【HtmlParser】HtmlParser使用
    爬虫简单示例,用httpClient4.2.1实现(转载)
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11216978.html
Copyright © 2011-2022 走看看