我的第一道强连通
#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"); }