厦门大学 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;
}
浙公网安备 33010602011771号