1 条题解

  • 0
    @ 2025-7-18 16:50:46

    不考虑优先限制的

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    vector<int> e[100000 + 5];
    int d[100000 + 5];
    queue<int> q;
    vector<int> ans;
    int main()
    {
        int t;
        cin >> t;
        while (t--)
        {
            cin >> n >> m;
            //-----清空 start-----
            for (int i = 1; i <= n; i++)
            {
                e[i].clear();
                d[i] = 0;
            }
            ans.clear();
            while (!q.empty())
                q.pop();
            //-----清空 end-----
            for (int i = 1; i <= m; i++)
            {
                int u, v;
                cin >> u >> v;
                e[u].push_back(v);
                d[v]++;
            }
            for (int i = 1; i <= n; i++)
                if (d[i] == 0)
                    q.push(i);
            bool flag = false; // 多解标记
            while (!q.empty())
            {
                if (q.size() > 1)
                    flag = true;
                int now = q.front();
                q.pop();
                ans.push_back(now);
                for (int i = 0; i < e[now].size(); i++)
                {
                    int v = e[now][i];
                    d[v]--;
                    if (d[v] == 0)
                        q.push(v);
                }
            }
            if (ans.size() != n)
            {
                cout << "Impossible!\n";
            }
            else
            {
                for (int i = 0; i < ans.size(); i++)
                    cout << ans[i] << " ";
                cout << "\n";
            }
        }
        return 0;
    }
    

    满分

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    vector<int> e[100000 + 5];
    int d[100000 + 5];
    priority_queue<int> q; // ~~~ 反图的大的优
    vector<int> ans;
    int main()
    {
        int t;
        cin >> t;
        while (t--)
        {
            cin >> n >> m;
            //-----清空 start-----
            for (int i = 1; i <= n; i++)
            {
                e[i].clear();
                d[i] = 0;
            }
            ans.clear();
            while (!q.empty())
                q.pop();
            //-----清空 end-----
            for (int i = 1; i <= m; i++)
            {
                int u, v;
                cin >> v >> u; // ~~~ 存反图
                e[u].push_back(v);
                d[v]++;
            }
            for (int i = 1; i <= n; i++)
                if (d[i] == 0)
                    q.push(i);
            bool flag = false; // 多解标记
            while (!q.empty())
            {
                if (q.size() > 1)
                    flag = true;
                int now = q.top();
                q.pop();
                ans.push_back(now);
                for (int i = 0; i < e[now].size(); i++)
                {
                    int v = e[now][i];
                    d[v]--;
                    if (d[v] == 0)
                        q.push(v);
                }
            }
            if (ans.size() != n)
            {
                cout << "Impossible!\n";
            }
            else
            {
                //~~~ 原本顺序是反向的大的优先,所以要倒着输出
                for (int i = (int)ans.size() - 1; i >= 0; i--)
                    cout << ans[i] << " ";
                cout << "\n";
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    4080
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    8
    已通过
    4
    上传者