题意就是做一个符合条件的排序,用到拓扑序列。
我一开始wa了多发,才发现有几个样例过不了,发现1->2->3...的顺序无法保证。
后来就想用并查集强连,还是wa;
后来发现发用反向拓扑排序+优先队列才可以通过;
这里注意把入度为0的入队改成了出度为0的入队
下面是AC代码:
#include <cstring> #include<queue> #include <cstdio> using namespace std; vector<int>to[30000+10]; int n,m,cnt; int outdeed[30000+10],topo [30000+10]; void init(){ memset(outdeed,0,sizeof(outdeed)); for(int i=1;i<=n;i++) to[i].clear(); memset(topo,0,sizeof(topo)); } void toposort() { priority_queue<int>q; for(int i=1;i<=n;i++) if(!outdeed[i])q.push(i); cnt=0; while(!q.empty()) { int tmp = q.top(); q.pop(); topo[++cnt]=tmp; int k = to[tmp].size(); for(int i=0;i<k;i++) { int tt = to[tmp][i]; outdeed[tt]--; if(outdeed[tt]==0)q.push(tt); } } } void output() { for(int i=n;i>=1;i--) printf("%d%c",topo[i],i==1?‘\n‘:‘ ‘); } int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); init(); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); to[v].push_back(u); outdeed[u]++; } toposort(); output(); } return 0; }