拓扑排序

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;
}
 

原文地址:https://www.cnblogs.com/letlifestop/p/10262993.html