zoukankan      html  css  js  c++  java
  • 拓扑排序

    http://hihocoder.com/problemset/problem/1175

    题目大意:

    这是一个病毒传播的问题,建立在一个有向无环图的基础上,每一次传播后一个病毒都会把自身的全部病毒都传给前面,问最终整个图一共有多少病毒。

    思路:拓扑排序裸题

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    # define maxn 100005
    int deg[maxn];
    int vir[maxn];
    vector<int>wakaka[maxn];
    int n,m,k;
    queue<int >q;
    void topsort()
    {
        for(int i=1; i<=n; i++)
        {
            if(!deg[i])
            {
                q.push(i);
            }//如果入度为0,压入栈
        }
       // while(!q.empty())q.pop();
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            int len=wakaka[top].size();
            for(int i=0; i<len; i++)
            {
                if(--deg[wakaka[top][i]]==0)
                {
                    q.push(wakaka[top][i]);
                }
                vir[wakaka[top][i]]=(vir[wakaka[top][i]]+vir[top])%142857;
            }

        }
    }
    int main()
    {
        cin>>n>>m>>k;
        memset(deg,0,sizeof(deg));
        memset(vir,0,sizeof(vir));
        for(int i=1; i<=n; i++)
        {
            wakaka[i].clear();
        }
        for(int i=1; i<=k; i++)
        {
            int t;
            cin>>t;
            vir[t]=1;
        }
        for(int i=1; i<=m; i++)
        {
            int u,v;
            cin>>u>>v;
            wakaka[u].push_back(v);
            deg[v]++;//记录入度
        }
           //cout<<1<<endl;
        topsort();
        int sum=0;
        for(int i=1; i<=n; i++)
        {
            sum=(sum+vir[i])%142857;
        }
        cout<<sum<<endl;
        return 0;
    }


    题目链接:https://nanti.jisuanke.com/t/16957

    题目大意:每一次移动只能按照有向无环图给定的方向进行移动,问你怎样按照标准走才能使得全程的权值最大。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    # define maxn 100005
    vector<pair<int,int > >wakaka[maxn];
    queue<int >q;
    int dp[maxn];
    int deg[maxn];
            int n,m;
    void topsort()
    {
        for(int i=1; i<=n; i++)
        {
            if(!deg[i])
            {
                q.push(i);
            }
        }
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            int len=wakaka[top].size();
            for(int i=0; i<len; i++)
            {
                int t=wakaka[top][i].first;
                if(--deg[t]==0)q.push(t);
                dp[t]=max(dp[t],dp[top]+wakaka[top][i].second);
            }
        }
    }
    int main()
    {
               ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--)
        {
            memset(dp,0,sizeof(dp));
            memset(deg,0,sizeof(deg));
            for(int i=1; i<=n; i++)
            {
                wakaka[i].clear();
            }
            while(!q.empty())q.pop();
            cin>>n>>m;
            for(int i=1;i <=m; i++)
            {
                int u,w,v;
                cin>>u>>w>>v;
                wakaka[u].push_back(make_pair(w,v));
                deg[w]++;
            }
            topsort();
            int maxx=-1;
            for(int i=1; i<=n; i++)
            {
                if(dp[i]>maxx)
                {
                    maxx=dp[i];
                }
            }
            cout<<maxx<<endl;
        }
        return 0;
    }
    http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2498.html

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    # define maxn 50000+10
    vector<pair<int,int> >wakaka[maxn];
    int deg[maxn];
    int dis[maxn];
    int path[maxn];
    queue<int >q;
    int n,m;
    void topsort()
    {
        for(int i=1; i<=n; i++)
        {
            if(deg[i]==0)
                q.push(i);
        }
        memset(path,0,sizeof(path));
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            int len=wakaka[top].size();
            for(int i=0; i<len; i++)
            {
                int temp=wakaka[top][i].first;
                if(--deg[temp]==0)
                {
                    q.push(temp);
                }
               // int s=wakaka[top][i].second;
                if((dis[temp]<dis[top]+wakaka[top][i].second)||(dis[temp]==dis[top]+wakaka[top][i].second&&path[temp]>top))//这个地方有一个坑点,在相等的时候需要比较path【temp】和top 的值。
                {
                    dis[temp]=dis[top]+wakaka[top][i].second;
                    path[temp]=top;
                    //cout<<path[temp]<<endl;
                }
            }
        }
        cout<<dis[1]<<endl;
        int t=1;
        while(path[t]!=0)
        {
            cout<<t<<" "<<path[t]<<endl;
            t=path[t];
        }
    }
    int main()
    {
        while(cin>>n>>m)
        {
            memset(dis,0,sizeof(dis));
            for(int i=1; i<=n; i++)
            {
                wakaka[i].clear();
            }
            while(!q.empty())q.pop();
            for(int i=1; i<=m; i++)
            {
                int u,v,w;
                cin>>u>>v>>w;
                wakaka[v].push_back(make_pair(u,w));//反向见图!!!
                deg[u]++;
            }
            topsort();
        }
        return 0;
    }
     

  • 相关阅读:
    线段树学习笔记
    树状数组学习笔记
    P1816 忠诚 ST表模版
    NOIP 2017 D1T2 时间复杂度
    Ubuntu镜像源
    字符串数据结构模板
    白书的一些奇怪模板
    高精度模板
    大整数类模板
    线段树模板1
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262993.html
Copyright © 2011-2022 走看看