POJ 1236 Network of Schools (强连通+缩点)

ft........这个题开始想错了,无限WA,后来看了DIS才知道,自己完全错了,这个题做的很郁闷........努力啊

不会Tarjan,丢人了,贴个连接,抓紧学习。

http://www.byvoid.com/blog/scc-tarjan/

 

  
    
#include < iostream >
#include
< cstdio >
#include
< algorithm >
#include
< memory.h >
#include
< cmath >
#include
< bitset >
#include
< queue >
#include
< vector >
using namespace std;

const int BORDER = ( 1 << 20 ) - 1 ;
const int MAXSIZE = 37 ;
const int MAXN = 205 ;
const int INF = 1000000000 ;
#define CLR(x,y) memset(x,y,sizeof(x))
#define ADD(x) x=((x+1)&BORDER)
#define IN(x) scanf("%d",&x)
#define OUT(x) printf("%d\n",x)
#define MIN(m,v) (m)<(v)?(m):(v)
#define MAX(m,v) (m)>(v)?(m):(v)
#define ABS(x) ((x)>0?(x):-(x))

using namespace std;

typedef
struct {
int v;
int next;
}Edge;

Edge edge_p[MAXN
* MAXN],edge_r[MAXN * MAXN];

int n,m,k,ans,index_p,index_r,cnt,ret1,ret2;
int net_p[MAXN],net_r[MAXN],order[MAXN], set [MAXN];
int in_dg[MAXN],out_dg[MAXN];
bool visit[MAXN];

void add_edge(Edge * edge, int * net, const int & u, const int & v, int & index)
{
edge[index].v
= v;
edge[index].next
= net[u];
net[u]
= index ++ ;
}
int init()
{
index_r
= index_p = 0 ;
CLR(net_p,
- 1 );
CLR(net_r,
- 1 );
CLR(visit,
0 );
CLR(order,
0 );
CLR(
set , 0 );
CLR(in_dg,
0 );
CLR(out_dg,
0 );
return 0 ;
}
int input()
{
int tmp;
for ( int i = 1 ; i <= n; ++ i)
{
for ( int j = 0 ; ; ++ j)
{
IN(tmp);
if ( ! tmp)
break ;
add_edge(edge_p,net_p,i,tmp,index_p);
add_edge(edge_r,net_r,tmp,i,index_r);
}
}
return 0 ;
}
void dfs_p( const int & u)
{
visit[u]
= true ;
for ( int i = net_p[u]; i != - 1 ; i = edge_p[i].next)
if ( ! visit[edge_p[i].v])
dfs_p(edge_p[i].v);
order[
++ cnt] = u;
}
void dfs_r( const int & u)
{
visit[u]
= true ;
set [u] = cnt;
for ( int i = net_r[u]; i != - 1 ; i = edge_r[i].next)
if ( ! visit[edge_r[i].v])
dfs_r(edge_r[i].v);
}
int find_dg()
{
int i,j,tmp;
ret1
= ret2 = 0 ;
for (i = 1 ; i <= n; ++ i)
for (j = net_p[i]; j != - 1 ; j = edge_p[j].next)
{
if ( set [i] != set [edge_p[j].v])
{
in_dg[
set [edge_p[j].v]] = 1 ;
out_dg[
set [i]] = 1 ;
}
}
for (i = 1 ; i <= cnt; ++ i)
{
if ( ! in_dg[i])
++ ret1;
if ( ! out_dg[i])
++ ret2;
}
return 0 ;
}
int work()
{
int i,j,tmp,u,v;
CLR(visit,
0 );
cnt
= 0 ;
for (i = 1 ; i <= n; ++ i)
if ( ! visit[i])
dfs_p(i);
CLR(visit,
0 );
cnt
= 0 ;
for (i = n; i > 0 ; -- i)
if ( ! visit[order[i]])
{
++ cnt;
dfs_r(order[i]);
}
find_dg();
if (cnt == 1 )
printf(
" 1\n0\n " );
else
printf(
" %d\n%d\n " ,ret1,MAX(ret1,ret2));
return 0 ;
}
int main()
{
while (IN(n) != EOF)
{
init();
input();
work();
}
return 0 ;
}

 

 

你可能感兴趣的:(NetWork)