还是不仔细!在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
*/