求调
查看原帖
求调
701387
xiaoliebao1115楼主2024/8/1 18:08
#include<bits/stdc++.h>
using namespace std;
const int nn=5e5+5;
int n,m,in[nn],head[nn],nxt[nn],cnt,bfin[nn];
struct node{
	int u,v;
}edge[nn];
void add(int u,int v){
	cnt++;
	edge[cnt].u=u,edge[cnt].v=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
	in[v]++;
	bfin[v]++;
}
priority_queue<int> q;
set<int> s;
int main(){
	cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		if(in[i]==0) q.push(-i);
	}
	int ans1=0,maxn=0;
	for(int i=1;i<=n;i++){
		int u=-q.top();
		q.pop();
		if(u>maxn){
			maxn=u;
			ans1++;
		}
		for(int j=head[u];j;j=nxt[j]){
			int v=edge[j].v;
			in[v]--;
			if(in[v]==0) q.push(-v);
		}
	}
	cout<<ans1<<endl;
	for(int i=1;i<=n;i++){
		in[i]=bfin[i];
		if(in[i]==0) s.insert(i);
	}
	int ans2=0; 
	maxn=0;
	for(int i=1;i<=n;i++){
		int u1=*s.begin(),u2=*s.end(),u;
		if(u1<maxn) u=u1;
		else u=u2;
		if(u>maxn){
			ans2++;
			maxn=u;
		}
		s.erase(u);
		for(int j=head[u];j;j=nxt[j]){
			int v=edge[j].v;
			in[v]--;
			if(in[v]==0) s.insert(v);
		}
	}
	cout<<ans2<<endl;
	return 0;
}
2024/8/1 18:08
加载中...