图论——topsort

Posted chdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图论——topsort相关的知识,希望对你有一定的参考价值。

今天学习topsort,明天强联通分量。topsort是一种在DAG(有向无环图)中来制定顺序的方法,从入度为0开始一个一个编排顺序直至所有的边都有了顺序(或者形成了环)最后如果图中还剩下元素那一定是个环,所以topsort还可以用来判环。今天打了到topsort的例题如下。

技术分享图片

这道题的意思就是说按一定顺序来做题入度一样的题可以一起做,看需要多长的时间,a所有的题都只要1min所以要初始化入度为0的题都需要1min,下面给出代码(打了两遍 ,都错在同一个地方我也真是orz了)。这个地方十分的神奇,好吧其实不神奇自己不认真,这个题的题目开始是从0开始的但我的tail加是从一开始最后便利的时候i从0到<n导致一直wa了一个点真不细心啊。

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    return x*f;
}
struct bwy
{
    int v,id;
}q[500];
int n,m;
int ans=0;
int a[500][500],b[5090],now[500],t=0;;
int main()
{
    freopen("1.in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        x=read();y=read();z=read();
        a[x][y]=z;
        b[y]++;
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==0)
        {
            q[++t].id=i;
            q[t].v=1;
        }
    }
    for(int j=1;j<=t;j++)
    {
        for(int i=0;i<n;i++)
        {
            if(a[q[j].id][i]!=0)
            {                                                 
                b[i]--;
                now[i]=max(now[i],a[q[j].id][i]+q[j].v);
                if(b[i]==0)
                {
                    q[++t].id=i;
                    q[t].v=now[i];
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,q[i].v);
    }
    printf("%d
",ans);
    return 0;
}
View Code

完事。

谁翻乐府凄凉曲,风也萧萧,雨也萧萧,瘦尽灯花又一宵。

以上是关于图论——topsort的主要内容,如果未能解决你的问题,请参考以下文章

图论-拓扑排序详解

Gym - 101503I 利用到图论的构造

topsort

复习计划

关于Topsort

SGU 515 Dij+Topsort