标签:des style color io os ar for sp div
4 0 3 2 1 2 1 3
4 2HintCase 2: First prove set 2 is a subset of set 1 and then prove set 3 is a subset of set 1.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
const int maxn=20000+100;
const int maxm=100000;
struct node{
int u,v;
int next;
}e[maxm];
int head[maxn],cntE;
int DFN[maxn],low[maxn];
int s[maxm],top,index,cnt;
int belong[maxn],instack[maxn];
int in[maxn],out[maxn];
int n,m;
void init()
{
top=cntE=0;
index=cnt=0;
CLEAR(DFN,0);
CLEAR(head,-1);
CLEAR(instack,0);
// CLEAR(belong,0);
}
void addedge(int u,int v)
{
e[cntE].u=u;e[cntE].v=v;
e[cntE].next=head[u];
head[u]=cntE++;
}
void Tarjan(int u)
{
DFN[u]=low[u]=++index;
instack[u]=1;
s[top++]=u;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].v;
if(!DFN[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low[u]=min(low[u],DFN[v]);
}
int v;
if(DFN[u]==low[u])
{
cnt++;
do{
v=s[--top];
belong[v]=cnt;
instack[v]=0;
}while(u!=v);
}
}
void work()
{
REPF(i,1,n)
if(!DFN[i]) Tarjan(i);
if(cnt<=1)
{
puts("0");
return ;
}
CLEAR(in,0);
CLEAR(out,0);
for(int i=0;i<cntE;i++)
{
int u=e[i].u,v=e[i].v;
if(belong[u]!=belong[v])
in[belong[v]]++,out[belong[u]]++;
}
int d_1=0,d_2=0;
REPF(i,1,cnt)
{
if(!in[i])
d_1++;
if(!out[i])
d_2++;
}
printf("%d\n",max(d_1,d_2));
}
int main()
{
int u,v;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
work();
}
return 0;
}
HDU 3836 Equivalent Sets(Tarjan+缩点)
标签:des style color io os ar for sp div
原文地址:http://blog.csdn.net/u013582254/article/details/40201893