我去,野生的florr 2U存档!
  • 板块灌水区
  • 楼主cmpt_xiaoxiao
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/5/27 21:33
  • 上次更新2024/5/27 22:01:54
查看原帖
我去,野生的florr 2U存档!
954694
cmpt_xiaoxiao楼主2024/5/27 21:33

rt

求调:

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int n,m,ind[100001],ans[100001];
vector<int>path[100001],edge[100001];
void tu(int x){
	for(int i=1;i<=n;i++) edge[i].clear(),ind[i]=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<path[i].size();j++){
			edge[path[i][j-1]].push_back(path[i][j]);
			ind[path[i][j]]++;
		}
	}	
}
bool topo(int x){
	tu(x);
	priority_queue<int,vector<int>,greater<int> >q;
	memset(ans,0,sizeof(ans));
	for(int i=1;i<=n;i++) if(!ind[i]) q.push(i);
	int cnt=0;
	while(!q.empty()){
		int u=q.top();
		q.pop();
		cnt++;
		ans[cnt]=u;
		for(auto v:edge[u]){
			ind[v]--;
			if(!ind[v]) q.push(v);
		}
	}
	return cnt==n;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		for(int j=1;j<=x;j++){
			int y;
			cin>>y;
			path[i].push_back(y);
		}
	}
	int l=0,r=m;
	while(l<r){
		int mid=(l+r+1)/2;
		if(topo(mid)) l=mid;
		else r=mid-1;
	}
	topo(l);
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
}
2024/5/27 21:33
加载中...