拓扑排序学习http://blog.csdn.net/hcbbt/article/details/9305675

来源:互联网 发布:电子数据交换应用流程 编辑:程序博客网 时间:2024/05/18 02:50

DFS实现

#include <iostream>

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=100;
int G[MAXN][MAXN],vis[MAXN],topo[MAXN];
int t,m,n;
bool dfs(int u)
{
    vis[u]=-1;
    for(int v=1;v<=n;v++)
    if(G[u][v])
    {
        if(vis[v]<0)
            return false;
        else if(!vis[v]&&!dfs(v))
            return false;
    }
    vis[u]=1;
    topo[t--]=u;
    return true;
}
bool toposort()
{
    t=n;
    memset(vis,0,sizeof(vis));
    for(int u=1;u<=n;u++)
    if(!vis[u]&&!dfs(u))
        return false;
    return true;
}
int main()
{
    freopen("in.txt","r",stdin);
    while(cin>>n>>m&&n&&m)
    {
        int u,v;
        memset(G,0,sizeof(G));
        for(int i=1;i<=m;i++)
        {
            cin>>u>>v;
            G[u][v]=1;
        }
        if(toposort())
        {
            for(int i=1;i<=n;i++)
            printf("%d ",topo[i]);
            printf("\n");
        }
        else
            printf("no answer\n");
    }
    return 0;
}
0 0
原创粉丝点击