http://acm.pku.edu.cn/JudgeOnline/problem?id=2367
很水的拓扑排序,我DFS写的。
代码#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 110;
vector <int> map[MAXN];
bool visited[MAXN];
int times = 0;
int f[MAXN];
void dfs(int v)
{
visited[v] = true;
for(int i=0;i<map[v].size();i++)
{
int next = map[v][i];
if(!visited[next])
{
dfs(next);
}
}
f[times++] = v;
}
int main()
{
int n;
memset(visited,false,sizeof(visited));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int to;
while(scanf("%d",&to)!=EOF&&to!=0)
{
map[i].push_back(to);
}
}
for(int i=1;i<=n;i++)
{
if(!visited[i])
{
dfs(i);
}
}
printf("%d",f[times-1]);
for(int i=times-2;i>=0;i--)
{
printf(" %d",f[i]);
}
printf("\n");
return 0;
}
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 110;
vector <int> map[MAXN];
bool visited[MAXN];
int times = 0;
int f[MAXN];
void dfs(int v)
{
visited[v] = true;
for(int i=0;i<map[v].size();i++)
{
int next = map[v][i];
if(!visited[next])
{
dfs(next);
}
}
f[times++] = v;
}
int main()
{
int n;
memset(visited,false,sizeof(visited));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int to;
while(scanf("%d",&to)!=EOF&&to!=0)
{
map[i].push_back(to);
}
}
for(int i=1;i<=n;i++)
{
if(!visited[i])
{
dfs(i);
}
}
printf("%d",f[times-1]);
for(int i=times-2;i>=0;i--)
{
printf(" %d",f[i]);
}
printf("\n");
return 0;
}
