Uva10305 - Ordering Tasks(拓扑排序经典例题)

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int map[110][110],vis[110];
int top[110];
int n,m,t;
bool dfs(int u)
{
    vis[u]=-1;
    for(int i=1;i<=n;i++)
    {
        if(map[u][i])
        {
            if(vis[i]<0) return false;
            else if(!vis[i]&&!dfs(i)) return false;
        }
    }
    vis[u]=1;
    top[--t]=u;
    return true;
}
bool solve()
{
    t=n;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
            if(dfs(i)!=1)
            return false;
    }
    return 1;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        if(n==0&&m==0)
            break;
        int s,e;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&s,&e);
            map[s][e]=1;
        }
        if(solve())
        {
            int flag=0;
            for(int i=0;i<n;i++)
            {
                if(flag==0)
                {
                    printf("%d",top[i]);
                    flag=1;
                }
                else printf(" %d",top[i]);
            }
            printf("\n");
        }
    }
}


你可能感兴趣的:(uva)