60分求助
查看原帖
60分求助
359908
zhixingtong楼主2023/10/5 15:05
#include<bits/stdc++.h>
using namespace std;
vector<int> b[200005];
int n,m,ver[200005],nex[200005],head[200005],deg[200005],tot;
void add(int x,int y){
	tot++;
	ver[tot]=y;
	nex[tot]=head[x];
	head[x]=tot;
	deg[y]++;
}
void build(int x){
	//memset(nex,0,sizeof(nex));
	//memset(ver,0,sizeof(ver));
	memset(deg,0,sizeof(deg));
	memset(head,0,sizeof(head));
	for(int i=1;i<=x;i++){
		for(int j=0;j<b[i].size()-1;j++){
			add(b[i][j],b[i][j+1]);
		}
	}
}
bool topsort_loop(int x){
	build(x);
	queue<int> q;
	int tot=0;
	for(int i=1;i<=n;i++)
		if(deg[i]==0) q.push(i);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=nex[i]){
			int y=ver[i];
			deg[y]--;
			if(deg[y]==0)
				q.push(y);
		}
	}
	for(int i=1;i<=n;i++)
		if(deg[i]==0) tot++;
	if(tot<n) return true;
	return false;
}
void topsort_answer(int x){
	build(x);
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++)
		if(deg[i]==0) q.push(i);
	while(!q.empty()){
		int x=q.top();q.pop();
		cout<<x<<" ";
		for(int i=head[x];i;i=nex[i]){
			int y=ver[i];
			deg[y]--;
			if(deg[y]==0)
				q.push(y);
		}
	}
	
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int c;
		cin>>c;
		for(int j=1;j<=c;j++){
			int a;
			cin>>a;
			b[i].push_back(a);
		}
	}
	int l=1,r=m,ans;
	while(l<=r){
		int mid=(l+r)/2;
		if(topsort_loop(mid)==false){
			l=mid+1;
			ans=mid;
		}
		else r=mid-1;
	}
	topsort_answer(ans);
	return 0;
}
2023/10/5 15:05
加载中...