题目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");
        }
    }
}

相关文章:

  • 2022-01-28
  • 2021-06-14
  • 2021-06-25
  • 2021-07-10
  • 2022-02-19
  • 2022-01-09
  • 2022-12-23
猜你喜欢
  • 2021-12-16
  • 2021-07-21
  • 2022-01-13
  • 2021-05-29
  • 2021-05-26
  • 2021-07-27
相关资源
相似解决方案