| ![]() |
Problem descriptions:
acmparand 2013-08-23
![]() |
#include"iostream"
#include"stdio.h"
#include"vector"
#include"functional"
#include"string"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int maxn=200;
int cnt[maxn];
int g[maxn][maxn];
int visit[maxn];
int topo[maxn];
int t;
int n,m;
bool dfs(int u)
{
visit[u]=-1; //正在访问
for(int v=0;v<n;v++)
{
if(g[u][v])
{
if(visit[v]<0) return false; //自环 与u邻接的点正在被访问
else if(!visit[v])
dfs(v); //未访问 就去访问它
}
}
visit[u]=1; //标记为访问
topo[--t]=u;
return true;
}
bool topo_sort()
{
t=n;
memset(visit,0,sizeof(visit));
for(int u=0;u<n;u++)
if(!visit[u])
{
bool res=dfs(u);
if(res==false) return false; //有自环
}
return true;
}
int main()
{
/*
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
*/
while(cin>>n>>m&&(n+m))
{
int i;
memset(g,0,sizeof(g));
for(i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
u--;v--;
g[u][v]=1;
}
bool fuck=topo_sort();
if(fuck==false) {cout<<"No"<<endl;continue;}
for(i=0;i<n-1;i++)
cout<<topo[i]+1<<" ";
cout<<topo[n-1]+1<<endl;
}
return 0;
}
#include"iostream"
#include"stdio.h"
#include"vector"
#include"functional"
#include"string"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int maxn=200;
vi g[maxn];
int visit[maxn];
int topo[maxn];
int t,n,m;
bool dfs(int u)
{
visit[u]=-1; //正在访问
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(visit[v]<0) return false; //自环 与u邻接的点正在被访问
else if(!visit[v])
dfs(v); //未访问 就去访问它
}
visit[u]=1; //标记为访问
topo[--t]=u;
return true;
}
bool topo_sort()
{
t=n;
memset(visit,0,sizeof(visit));
for(int u=0;u<n;u++)
if(!visit[u])
{
bool res=dfs(u);
if(res==false) return false; //有自环
}
return true;
}
int main()
{
/*
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
*/
while(cin>>n>>m&&(n+m))
{
int i;
memset(g,0,sizeof(g));
for(i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
u--;v--;
g[u].push_back(v);
}
bool fuck=topo_sort();
if(fuck==false) {cout<<"No"<<endl;continue;}
for(i=0;i<n-1;i++)
cout<<topo[i]+1<<" ";
cout<<topo[n-1]+1<<endl;
}
return 0;
}