图论——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<=t;i++)
    {
        ans=max(ans,q[i].v);
    }
    printf("%d
",ans);
    return 0;
}
View Code

完事。

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

原文地址:https://www.cnblogs.com/chdy/p/9680209.html