思路:蛋疼的一道题目,自己又想多了,记录所有点的出度(缩点),如果该缩点的出度为0,那么其解就是该缩点里所有点的总数,否则无解
#include<iostream> #include<algorithm> #include<cstdio> #include<string.h> #include<vector> #include<stack> #define maxn 11111 using namespace std; int V,E,sum,tem; int dfn[maxn],low[maxn],vis[maxn],outd[maxn],belong[maxn],ind[maxn]; int ans[maxn]; vector<int>gra[maxn]; stack<int>S; int MIN(int a,int b) { return a>b?b:a; } void tarjan(int pox) { vis[pox]=2; dfn[pox]=low[pox]=++sum; S.push(pox); for(int i=0; i<gra[pox].size(); i++) { int t=gra[pox][i]; if(!dfn[t]) { tarjan(t); low[pox]=MIN(low[pox],low[t]); } else if(vis[t]==2) { low[pox]=MIN(low[pox],dfn[t]); } } if(dfn[pox]==low[pox]) { ++tem; while(!S.empty()) { int gh=S.top(); S.pop(); outd[gh]=0; belong[gh]=tem; vis[gh]=1; ans[tem]++;//记录缩点的变量。 if(gh==pox) break; } } } int main() { int a,b; while(scanf("%d%d",&V,&E)!=EOF) { tem=sum=0; memset(ans,0,sizeof(ans)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); memset(belong,0,sizeof(belong)); memset(ind,0,sizeof(ind)); for(int i=0; i<maxn; i++) gra[i].clear(); while(!S.empty()) S.pop(); for(int i=0; i<E; i++) { scanf("%d%d",&a,&b); gra[a].push_back(b); } for(int i=1; i<=V; i++) if(!dfn[i]) tarjan(i); for(int i=1; i<=V; i++) for(int j=0; j<gra[i].size(); j++) { if(belong[i]!=belong[gra[i][j]]) { outd[belong[i]]++;//记录缩点的出度 } } int flag=0; int as=0; int As=0; for(int i=1; i<=tem; i++) { if(outd[i]==0) { As++; flag=i; } } // printf("As=%d\n",As); if(As==1) { // printf("zhu hao\n"); printf("%d\n",ans[flag]); } else { printf("0\n"); } } return 0; }