题目链接
还是不仔细!在poj上做过原题,这题只是简单的加了个多组数据,朋友帮助下,终于找到了错误点~
可以看原题
#include<stdio.h> #include<string.h> #include<vector> #include<stack> using namespace std; #define min(a,b) a<b?a:b #define max(a,b) a>b?a:b int Belong[105]; int Bcnt,time,n; int in[105]; int out[105]; int dfn[105]; int low[105]; bool in_S[105]; vector<int>e[105]; stack<int>S; void tarjan(int u) { int i,v; S.push(u); in_S[u]=true; dfn[u]=low[u]=++time; for(i=0;i<e[u].size();i++) { v=e[u][i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(in_S[v]) { low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]) { Bcnt++; do{ v=S.top(); in_S[v]=false; S.pop(); Belong[v]=Bcnt; }while(v!=u); } } void init() { memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(Belong,0,sizeof(Belong)); memset(in_S,false,sizeof(in_S)); Bcnt=0; time=0; } int main() { int T; scanf("%d",&T); while(T--) { memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); int u,v,i,j; scanf("%d",&n); for(i=0;i<=n;i++) { e[i].clear(); } for(u=1;u<=n;u++) { while(scanf("%d",&v)&&v) { e[u].push_back(v); } } init(); for(i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } if(Bcnt==1) { printf("0\n"); continue; } for(i=1;i<=n;i++) { for(j=0;j<e[i].size();j++) { v=e[i][j]; if(Belong[i]!=Belong[v]) { in[Belong[v]]++; out[Belong[i]]++; } } } int num=0,num2=0; for(i=1;i<=Bcnt;i++) { if(in[i]==0) num++; if(out[i]==0) num2++; } printf("%d\n",max(num,num2)); } return 0; } /* 5 2 4 3 0 4 5 0 0 0 1 0 3 2 0 3 0 0 2 1 */