厦门大学 ACM 1459 拓扑排序

链接  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1459

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

struct date
{
    int v,next;
}edge[212345];
int k,head[112345];
vector<int>v;
bool vis[112345],vic[112345],vit[112345],fell;
void add_edge( int u,int v ){
    edge[k].v = v;
    edge[k].next = head[u];
    head[u] = k++;
}
void DFS( int u ){
    vit[u] = true;
    if( fell )return;
    for( int i = head[u]; i != -1; i = edge[i].next )
    {
        if(  vit[edge[i].v] ) { fell = true;return;}
        if( !vis[edge[i].v] ) DFS( edge[i].v );
    }
    vit[u] = false; vis[u] = true;
    v.push_back( u );
}
int main( )
{
    int N,M,U,V;
    while( scanf("%d%d",&N,&M) != EOF )
    {
        k = 0;
        memset( head,-1,sizeof(head) );
        memset(   vic,0,sizeof(vic) );
        for( int i = 1; i <= M; i++ )
        {
            scanf("%d%d",&U,&V);
            add_edge( U,V );
            vic[V] = true;
        }
        v.clear(); fell = false;
        memset( vis,0,sizeof(vis) );
        memset( vit,0,sizeof(vit) );
        for( int i = 1; i <= N; i++ )
           if( !vic[i] && !fell ) DFS( i );
        if( fell ){ printf("-1\n"); continue; }
        int len = v.size(); len--;
          printf("%d",v[len]);len--;
        for( int i = len; i >= 0; i-- )
          printf(" %d",v[i]);
        puts("");
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/wulangzhou/p/3079545.html