/ WHOJ / 题库 / 文物 /

题解

1 条题解

  • 1
    @ 2022-09-04 15:25:46
    #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

信息

ID
1638
难度
7
分类
拓扑排序 点击显示
标签
递交数
5
已通过
1
通过率
20%
上传者