拓扑算法

这是网上看到的一个比较清晰的入门的拓扑算法

链接:http://www.cnblogs.com/dolphin0520/archive/2011/04/16/2017737.html

感觉可以用vector简化,今天没有时间写了,明天有时间再整理。

今天先把这段代码贴上来。

hdu1285



自己打了一遍做了一些注释,但还没完全搞懂。

#include

#include

#include


#define MAXN 600


using namespace std;


int n,m,indegree[MAXN],G[MAXN][MAXN],q[MAXN];

//


int toposort()

{

    int i,j,k;

    i=0;

    while(i<n)

    {

        for(j=1;j<=n;j++)

        {

            if(indegree[j]==0)

            {

                indegree[j]--;  //ingegree == -1;

                q[i++] = j;    //

                for(k=1;k<=n;k++)

                {

                    if(G[j][k]) //G的始点,终点数组

                        indegree[k]--;

                    break;

                }

            }

        }

    }

    return 1;

}

//拓扑算法


int main()

{

    int i,a,b;

    while(cin>>n>>m)

    {

        //n个队,相当于n个点;m场比赛,相当于m条边

        

        memset(G,0,sizeof(G));

        memset(indegree,0,sizeof(indegree));

        

        for(i=1;i<=m;i++)

        {

            cin>>a>>b;

            if(G[a][b]==0)

            {

                G[a][b]=1;

                indegree[b]++;

            }

        }

        toposort();

        for(i=0;i<n;i++)

        {

            if(i!=n-1)

                cout<<q[i]<<endl;

            else

                cout<<q[i]<<endl;

        }

    }

    return 0;

}



你可能感兴趣的:(待解救,模版)