Sicily1940-Ordering Tasks

//开始的时候就以为是个拓扑排序而已,忽略了其中的题目要求最小的解答,然后一直wa,后来仔细考虑以后使用了set作为结构
//使用STL的set的优势在于保证当把入度为0的task输入进去之后头元素最小,而queue不能保证这点
//例如:输入
//3 1;3 5;4 2;4 6;
//正确的输出应该是3 1 4 2 5 6
#include "iostream"
#include "vector"
#include "algorithm"
#include "cstring"
#include "set"
using namespace std;
int in[100100];
vector<int> a[100100];
set<int>s;
void bfs(){
    while(!s.empty()){
        int n = *s.begin();
        s.erase(s.begin());
        cout<<n<<" ";
        for(int i=0;i<a[n].size();i++){
            int v = a[n][i];
            if(--in[v]==0){
                s.insert(v);
                
            }
        }
    }
    cout<<endl;
}
int main(){
    int cases;
    int m,n;
    cin>>cases;
    while(cases--){
        memset(in,0,sizeof(in));
        memset(a,0,sizeof(a));
        s.clear();
        cin>>n>>m;
        
        int u,v;
        for (int i = 0; i < m; ++i)
        {
            cin>>u>>v;
            a[u].push_back(v);
            in[v]++;
        }
        for (int i = 1; i <= n; ++i)
        {
            if(!in[i]){
                s.insert(i);
            }
        }
        bfs();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值