题目链接:dfs、bfs、tarjan
今天只会一个拓扑排序
留个坑学会了再补
C:
#include <iostream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int indegree[205];
int topo[205];
int G[205][205];
int m, n;
priority_queue<int, vector<int>, less<int> >q;
void init()
{
memset(indegree, 0, sizeof(indegree));
memset(G, 0, sizeof(G));
}
bool bfs()
{
while (q.size()) q.pop();
int t = n;
for (int i = n; i >= 1; i--)
if (indegree[i] == 0)
q.push(i);
while (q.size())
{
int u = q.top();
q.pop();
topo[u] = t--;
for (int v = 1; v <= n; v++)
{
if (G[u][v])
{
indegree[v]--;
if (indegree[v] == 0)
q.push(v);
}
}
}
if (t == 0) return true;
return false;
}
int main()
{
int i, a, b, t;
scanf("%d", &t);
while (t--)
{
init();
scanf("%d%d", &n, &m);
for (i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
if (G[b][a] == 0) indegree[a]++;
G[b][a] = 1;
}
if (bfs())
{
for (i = 1; i <= n; i++)
{
if (i != n)
printf("%d ", topo[i]);
else
printf("%d\n", topo[i]);
}
}
else printf("-1\n");
}
}