1 条题解
-
0Guest LV 0 MOD
-
1
#include<iostream> #include<cstring> using namespace std; const int maxn=1e5+10,maxm=1e6+10; struct e{int from,to,next;}edge[maxm]; int n,m,ti,tj,work[maxn];//读入的数据 int head[maxm],ans1=0,ans2=0,cnt=1;//邻接表(不是邻接矩阵)。 int q1[maxn],q2[maxn],vin[maxn],vinn[maxn],_left,h1=0,t1=0,h2=0,t2=0;//vin为入度。 void addedge(int from,int to){ edge[cnt].from=from; edge[cnt].to=to; edge[cnt].next=head[from]; head[from]=cnt++; } void set(){ for(int i=1;i<=n;i++) if(vin[i]==0) if(work[i]==1) q1[t1++]=i; else q2[t2++]=i; } void topsort(int lab){ if(lab==0){ while(h1<t1){ for(int i=head[q1[h1]];i!=0;i=edge[i].next) if((--vin[edge[i].to])==0) if(work[edge[i].to]==1) q1[t1++]=edge[i].to; else q2[t2++]=edge[i].to; h1++; _left--; } }else{ while(h2<t2){ for(int i=head[q2[h2]];i!=0;i=edge[i].next) if((--vin[edge[i].to])==0) if(work[edge[i].to]==1) q1[t1++]=edge[i].to; else q2[t2++]=edge[i].to; h2++; _left--; } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>work[i]; for(int i=1;i<=m;i++){ cin>>ti>>tj; addedge(ti,tj); vin[tj]++; vinn[tj]++; } _left=n; set(); topsort(1); while(_left>0){ ans1++; topsort((ans1+1)%2); } for(int i=1;i<=n;i++) vin[i]=vinn[i]; h1=h2=t1=t2=0; _left=n; set(); topsort(0); while(_left>0){ ans2++; topsort(ans2%2); } cout<<min(ans1,ans2); return 0; }
- 1