题解 P3243 【[HNOI2015]菜肴制作】
题目link
反向图的拓扑排序
#include <bits/stdc++.h>
using namespace std;
int n, m , ip1, ip2, d[100010], T, TMP[100010], tt;
vector<int>a[100010];
int main()
{
scanf("%d", &T);
while(T--)
{
memset(TMP, 0, sizeof(TMP));
memset(d, 0, sizeof(d));
priority_queue<int>Q;
scanf("%d%d", &n, &m);
tt = n;
for(int i=1;i<=n;i++)
{
a[i].clear();
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &ip1, &ip2);
a[ip2].push_back(ip1);
d[ip1]++;
}
for(int i = 1; i <= n; i++)
if(d[i] == 0)
Q.push(i);
while(!Q.empty())
{
int tmp = Q.top();
TMP[tt--] = tmp;
Q.pop();
for(int i = 0; i < a[tmp].size(); i++)
{
int ti=a[tmp][i];
d[ti]--;
if(d[ti] == 0)
Q.push(ti);
}
}
if(tt)
{
printf("Impossible!\n");
}
else
{
for(int i = 1; i <= n; i++)
printf("%d ", TMP[i]);
printf("\n");
}
}
}