拓扑排序。
CODE:
#include <iostream>
using namespace std;
const int SIZE = 510;
int topo[SIZE], ind[SIZE];
int G[SIZE][SIZE];
int n, m;
int toposort()
{
for(int i = 1; i <= n; i++)
{
int u;
for(u = 1; u <= n; u++)
if(!ind[u]) break;
if(u > n) return 0;
topo[i] = u; ind[u]--;
for(int v = 1; v <= n; v++)
if(G[u][v]) ind[v]--;
}
return 1;
}
void init()
{
memset(ind, 0, sizeof(ind));
memset(G, 0, sizeof(G));
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
init();
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
if(G[u][v] == 0) //去重边
{
G[u][v] = 1;
ind[v]++;
}
}
toposort();
for(int i = 1; i <= n; i++)
{
printf(i!=n?"%d ":"%d\n", topo[i]);
}
}
return 0;
}
using namespace std;
const int SIZE = 510;
int topo[SIZE], ind[SIZE];
int G[SIZE][SIZE];
int n, m;
int toposort()
{
for(int i = 1; i <= n; i++)
{
int u;
for(u = 1; u <= n; u++)
if(!ind[u]) break;
if(u > n) return 0;
topo[i] = u; ind[u]--;
for(int v = 1; v <= n; v++)
if(G[u][v]) ind[v]--;
}
return 1;
}
void init()
{
memset(ind, 0, sizeof(ind));
memset(G, 0, sizeof(G));
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
init();
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
if(G[u][v] == 0) //去重边
{
G[u][v] = 1;
ind[v]++;
}
}
toposort();
for(int i = 1; i <= n; i++)
{
printf(i!=n?"%d ":"%d\n", topo[i]);
}
}
return 0;
}