HDU-4857 逃生

来源:互联网 发布:网络玄幻小说家排名 编辑:程序博客网 时间:2024/05/14 05:48

题目链接:https://vjudge.net/problem/HDU-4857

优先队列加拓扑排序,挑大的从后往前排

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<set>#include<queue>using namespace std;const int N=30000+10;set<int> g[N];int n,m;int ind[N],topo[N];bool topsort(){priority_queue<int> q;for(int i=1;i<=n;i++)if(ind[i]==0) q.push(i);int t=n;    while(!q.empty()){        int k=q.top();        q.pop();        topo[t--]=k;        for(set<int>::iterator it=g[k].begin();it!=g[k].end();it++)        {        ind[*it]--;        if(ind[*it]==0)        q.push(*it);        }    }    return true;}int main(){int T,a,b;scanf("%d",&T);while(T--){memset(ind,0,sizeof(ind));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)g[i].clear();for(int i=0;i<m;i++){scanf("%d%d",&a,&b);if(!g[b].count(a)){g[b].insert(a);ind[a]++;}}if(topsort()){for(int i=1;i<n;i++)printf("%d ",topo[i]);printf("%d\n",topo[n]);}}return 0;}

原创粉丝点击