现在的位置: 首页 > 综合 > 正文

vijos1626 爱在心中——by rfy

2018年05月02日 ⁄ 综合 ⁄ 共 1172字 ⁄ 字号 评论关闭

我的第一道强连通

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> ljb[200000],nljb[200000],jh[200000];
int n,m,i,x,y,wz,zn,ans,bcnt,dfn[200000],belong[200000],
instack[200000],low[200000],dindex,stap[200000],stop;
void tarjan(int i){
    dfn[i]=low[i]=++dindex;
    instack[i]=1;
    stap[++stop]=i;
    vector<int>::iterator iv;
    for (iv=ljb[i].begin();iv!=ljb[i].end();iv++){
        if (!dfn[*iv]){
            tarjan(*iv);
            if (low[*iv]<low[i])
                low[i]=low[*iv];
        }
        else if (instack[*iv]&&dfn[*iv]<low[i])
            low[i]=dfn[*iv];
    }
    if (dfn[i]==low[i]){
        bcnt++;
        int lj=0,j;
        do{
            j=stap[stop--];
            instack[j]=0;
            belong[j]=bcnt;
            jh[bcnt].push_back(j);
            lj++;
        }
        while (j!=i);
        if (lj>1) ans++;
    }
}
void work(){
    int i;
    for (i=1;i<=n;i++)
        if (!dfn[i])
            tarjan(i);
    printf("%d\n",ans);
}
int main(){
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        ljb[x].push_back(y);
    }
    
    work();
    
    vector<int>::iterator iv;    
    for (i=1;i<=n;i++)
        for (iv=ljb[i].begin();iv!=ljb[i].end();iv++)
            if (belong[i]!=belong[*iv])
                nljb[belong[i]].push_back(belong[*iv]);
    for (i=1;i<=bcnt;i++)
        if (!nljb[i].size()){
            zn++;
            wz=i;
        }
    if (zn==1&&jh[wz].size()>1){
        int sn=0,s[200000];
        for (iv=jh[wz].begin();iv!=jh[wz].end();iv++){
            sn++;
            s[sn]=*iv;
        }
        sort(s+1,s+sn+1);
        for (i=1;i<=sn;i++)
            printf("%d ",s[i]);
    }
    else printf("-1");
}

抱歉!评论已关闭.