蒟蒻求救!
查看原帖
蒟蒻求救!
354310
Tnuzy_plzro楼主2022/12/20 10:43

WA #6 #32 ,求救!

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n,k;
const int N=1e5+10;
struct edge{int v,w;};
vector<edge> g[N];
int bel[N],dfn[N],low[N],ins[N];
int stk[N<<1],tot=0,st=0,clr=0;;
void tarjan(int x){
    dfn[x]=low[x]=++tot;
    stk[++st]=x;ins[x]=1;
    for(auto i:g[x]){
        if(!dfn[i.v]){
            tarjan(i.v);
            low[x]=min(low[x],low[i.v]);
        }else if(ins[i.v]){
            low[x]=min(low[x],dfn[i.v]);
        }
    }
    if(dfn[x]==low[x]){
        clr++;
        while(stk[st]!=x){
            bel[stk[st]]=clr;ins[stk[st]]=0;st--;
        }bel[stk[st]]=clr;ins[stk[st]]=0;st--;
    }
}
queue<int> Q;
int dis[N],vis[N],rd[N];
vector<edge> G[N];
signed main(){
    cin>>n>>k;
    rep(i,1,k){
        int x,a,b;cin>>x>>a>>b;
        if(x==1)g[a].push_back({b,0}),g[b].push_back({a,0});
        else if(x==2)g[a].push_back({b,1});
        else if(x==3)g[b].push_back({a,0});
        else if(x==4)g[b].push_back({a,1});
        else g[a].push_back({b,0});
    }
    rep(i,1,n)if(!dfn[i])tarjan(i);
    rep(i,1,n){
        for(auto j:g[i]){
            if(bel[i]==bel[j.v]){
                if(j.w==1)puts("-1"),exit(0);
            }else{
                G[bel[i]].push_back({bel[j.v],j.w});
                rd[bel[j.v]]++;
            }
        }
    }
    rep(i,1,clr)G[n+1].push_back({i,0}),rd[i]++;
    Q.push(n+1);dis[n+1]=1;
    while(!Q.empty()){
        int t=Q.front();Q.pop();vis[t]=1;
        for(auto i:G[t]){
            if(!vis[i.v]){
                dis[i.v]=max(dis[i.v],dis[t]+i.w);
                rd[i.v]--;
                if(!rd[i.v])Q.push(i.v);
            }
        }
    }
    rep(i,1,clr){
        if(rd[i])puts("-1"),exit(0);
    }int ans=0;
    rep(i,1,n){
        ans+=dis[bel[i]];
    }cout<<ans;
}
2022/12/20 10:43
加载中...