拓扑排序

输入描述:

输入第行为一个正整数T (T <= 10), 表示有T组数据。

每组数据第一行,输入两个正整数N,M(1

输出描述:

对于每组数据,如果能唯一确定比赛排名, 则输出比赛排名。否则输出NO

输入示例

4

3 2

2 1 3

2 1 2

4 3

3 1 2 3

2 1 3

2 1 4

4 1

4 1 2 3 4

4 3

3 1 2 4

3 1 3 4

2 3 2

输出示例

NO

NO

1 2 3 4

1 3 2 4


#include <iostream>

#include <unordered_set>

#include <vector>

#include <queue>

using namespace std;

void solve(){

    int N,M,C;

    cin>>N>>M;

    vector<unordered_set<int>> child(N+1),parent(N+1);

    while(M--){

        cin>>C;

        int pre=-1,x;

        while(C--){

            cin>>x;

            if(pre!=-1){

                child[pre].insert(x);

                parent[x].insert(pre);

            }

            pre=x;

        }

    }

    //寻找最开始的元素

    vector<int> index(N+1);

    queue<int> q;

    for(int i=1;i<=N;i++){

        index[i]=parent[i].size();

        if(index[i]==0){

            q.push(i);

        }

    }

    //依次寻找元素

    vector<int> ans;

    while(!q.empty()){

        if(q.size()!=1) break; //判断是否唯一

        int u=q.front();

        ans.push_back(u);

        q.pop();

        while(!child[u].empty()){

            int v=*child[u].begin();  //依次寻找

            if(--index[v]==0){  //index[v] ,v前有多人,证明u不是前面一个,减一

                q.push(v);

            }

            child[u].erase(v);

        }

    }

    if(ans.size()!=N){

        cout<<"NO"<<endl;

    }else{

        for(int i=0;i<ans.size();i++){

            cout<<ans[i]<<' ';

        }

        cout<<endl;

    }

}

int main()

{

  int T;

    cin>>T;

    while(T--){

        solve();

    }

  return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设原始数据规模为n,需要采样的数量为k 先选取数据流中的前k个元素,保存在集合A中; 从第j(k + 1 <= j...
    Impossible安徒生阅读 352评论 0 0
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    AIM外星人阅读 1,359评论 0 1
  • 不支持上传文件,所以就复制过来了。作者信息什么的都没删。对前端基本属于一窍不通,所以没有任何修改,反正用着没问题就...
    全栈在路上阅读 2,084评论 0 2
  • 技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1....
    CurryCoder阅读 2,043评论 0 2
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 9,087评论 0 4

友情链接更多精彩内容