caioj吧 关注:10贴子:8
  • 0回复贴,共1

1148找不到错在哪里,1147的纯膜板是可以过的

只看楼主收藏回复

#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
//===========================================
int bN,n,m,i,j,k,x,y,top,id,s1,s2,cnt,ans,l;
int zhan[20005],bos[20005],num[20005],bel[20005];
bool bj[20005],rud[20005],chu[20005];
vector<int> map[20005];
//=============================================
int mmax(int a,int b) { return a>b?a:b;}
int mmin(int a,int b) { return a<b?a:b;}
//========================================
void cle()
{
int i;
///======================
top=0; id=0; s1=0; s2=0;
memset(num,0,sizeof(num));
memset(bj,false,sizeof(bj));
memset(rud,false,sizeof(rud));
memset(chu,false,sizeof(chu));
for (i=1;i<=n;i++)
map[i].clear();
cnt=0;
}
//================
void dfs(int x)
{
int i,l,y;
//==========================
bj[x]=true; zhan[++top]=x;
num[x]=bos[x]=++id;
l=map[x].size();
//================
for (i=0;i<l;i++)
{
y=map[x][i];
if (!num[y])
{
dfs(y);
bos[x]=mmin(bos[x],bos[y]);
}
else
{
if (bj[y])
bos[x]=mmin(bos[x],bos[y]);
}
}
//-------------------------
if (bos[x]==num[x])
{
cnt++;
do{
i=zhan[top--]; bj[i]=false;
bel[i]=cnt;
}while(i!=x);
}
}
//===============
int main()
{
//freopen("c1148.in","rb",stdin);
//freopen("c1148.out","wb",stdout);
//================================
scanf("%d",&bN);
//===================
for (i=1;i<=bN;i++)
{
cle();
//======================
scanf("%d%d",&n,&m);
for (j=1;j<=m;j++)
{
scanf("%d%d",&x,&y);
map[x].push_back(y);
}
//===================
for (j=1;j<=n;j++)
if (!num[j])
dfs(j);
//-----------------
for (j=1;j<=n;j++)
{
l=map[j].size();
for (k=0;k<l;k++) {
y=map[j][k];
if (bel[j]!=bel[y]) {
chu[bel[j]]=true;
rud[bel[y]]=true;
}
}
}
//---------------------
for (j=1;j<=cnt;j++)
{
if (!rud[j]) s1++;
if (!chu[j]) s2++;
}
ans=mmax(s1,s2);
//==================
printf("%d\n",ans);
}
//========
return 0;
}


IP属地:广东1楼2017-09-23 23:04回复