题解 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");
        }
    }
}
posted @ 2019-04-25 20:27  G_A_TS  阅读(390)  评论(0编辑  收藏  举报