zoukankan      html  css  js  c++  java
  • L3-023 计算图

    建立结构体保存每个结点的前驱,操作符,来回两遍拓扑排序~

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=50014;
    struct node {
        vector<int> pre;
        double data;
        int fuhao=0;
    }Node[maxn];
    vector<int> g[maxn];
    int a[maxn];
    int inDegree[maxn];
    int N;
    stack<int> topOrder;
    double getnum (node a) {
        if (a.pre.size()==0) return a.data;
        else if (a.pre.size()==1) {
            if (a.fuhao==4) return exp(Node[a.pre[0]].data);
            else if (a.fuhao==5) return log(Node[a.pre[0]].data);
            else if (a.fuhao==6) return sin(Node[a.pre[0]].data);
        } 
        else if (a.pre.size()==2) {
            if (a.fuhao==1) return Node[a.pre[0]].data+Node[a.pre[1]].data;
            else if (a.fuhao==2) return Node[a.pre[0]].data-Node[a.pre[1]].data;
            else if (a.fuhao==3) return Node[a.pre[0]].data*Node[a.pre[1]].data;
        }
    }
    double topSort () {
        queue<int> q;
        for (int i=0;i<N;i++)
        if (inDegree[i]==0) q.push(i);
        while (!q.empty()) {
            int u=q.front();
            q.pop();
            topOrder.push(u);
            Node[u].data=getnum(Node[u]);
            for (int i=0;i<g[u].size();i++)
            if (--inDegree[g[u][i]]==0) q.push(g[u][i]);
            if (q.empty()) return Node[u].data;
        }
    }
    double dfs (int u,int x) {
        if (Node[u].fuhao==0) {
            if (u==x) return 1;
            else return 0;
        }
        else if (Node[u].fuhao==1) return dfs(Node[u].pre[0],x)+dfs(Node[u].pre[1],x);
        else if (Node[u].fuhao==2) return dfs(Node[u].pre[0],x)-dfs(Node[u].pre[1],x);
        else if (Node[u].fuhao==3) return dfs(Node[u].pre[0],x)*Node[Node[u].pre[1]].data+dfs(Node[u].pre[1],x)*Node[Node[u].pre[0]].data;
        else if (Node[u].fuhao==4) return exp(Node[Node[u].pre[0]].data)*dfs(Node[u].pre[0],x);
        else if (Node[u].fuhao==5) return 1.0/Node[Node[u].pre[0]].data*dfs(Node[u].pre[0],x);
        else if (Node[u].fuhao==6) return cos(Node[Node[u].pre[0]].data)*dfs(Node[u].pre[0],x);
    }
    int main () {
        scanf ("%d",&N);
        int fuhao;
        double x,y;
        vector<int> v1;
        for (int i=0;i<N;i++) {
            scanf ("%d",&fuhao);
            if (fuhao==0) {
                scanf ("%lf",&x);
                Node[i].data=x;
                v1.push_back(i);
            }
            else if (fuhao>=1&&fuhao<=3) {
                scanf ("%lf %lf",&x,&y);
                Node[i].pre.push_back((int)x);
                Node[i].pre.push_back((int)y);
                inDegree[i]+=2;
                g[(int)x].push_back(i);
                g[(int)y].push_back(i);
                Node[i].fuhao=fuhao;
            }
            else if (fuhao>=4&&fuhao<=6) {
                scanf ("%lf",&x);
                Node[i].pre.push_back((int)x);
                inDegree[i]+=1;
                g[(int)x].push_back(i);
                Node[i].fuhao=fuhao;
            }
        }
        printf ("%.3f
    ",topSort());
        int u=topOrder.top();
        for (int i=0;i<v1.size();i++) {
            if (i!=0) printf (" ");
            printf ("%.3f",dfs(u,v1[i]));
        }
        return 0;
    }
  • 相关阅读:
    Python集成开发环境Pycharm+Git+Gitee(码云)
    【AI图像识别二】JMeter轻松实现大数据量AI图像识别接口测试
    pycharm中django同步数据库问题
    绿盟-WEB应用漏洞扫描系统
    Python脚本轻松实现批量图片重命名
    Linxu下JMeter进行接口压力测试
    依赖Anaconda环境安装TensorFlow库,避免采坑
    【AI图像识别一】人脸识别测试探索
    Postgresql死锁的处理
    PostgreSQL 9.5,带来 UPSERT 等新特性
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12309859.html
Copyright © 2011-2022 走看看