ÕâÁ½µÀÌâ²î²»¶à£¬POJÕâµÀÎҺܾÃÒÔǰ¾Í×ö¹ý£¬µ«ÊDZÈÈüµÄʱºò¾ÓȻûÏëÆðÀ´
POJ ÕâµÀÌâµÄÌâÒâÊÇ£¬N¸öÍõ×Óÿ¸öÈ˶¼ÓÐϲ»¶µÄ¹«Ö÷£¬µ±ËûÃÇÑ¡¶¨Ò»¸ö¹«Ö÷½á»éʱ£¬±ØÐëÊǵÄʣϵÄÈËÒ²ÄÜÕÒµ½Ëûϲ»¶µÄ¹«Ö÷½á»é¡£
˼·£¬Ê×ÏȶÔÓÚÍõ×Ó£¬¶ÔÓÚÿһ¸öËûϲ»¶µÄ¹«Ö÷£¬Ö±½ÓÁ¬±ß£¬È»ºóÔÙ¸ù¾ÝÒѾ¸ø³öµÄÆ¥Åä·½°¸£¬½¨Á¢¹«Ö÷->Íõ×ӵıߡ£
×îºóÇó³öSCCºóÔÚͬһǿÁªÍ¨·ÖÁ¿ÀïµÄÍõ×Ӻ͹«Ö÷¾Í¿ÉÒÔÁË¡£
´úÂë¾Í²»ÌùÁË
ÏÂÃæÔÙ½²Ò»ÏÂHDU 4685ÕâµÀÌ⣬Á½µÀÌâµÄÎ¨Ò»Çø±ð¾ÍÊÇ£¬ÉÏÒ»µÀÌ⣬ÿ¸ö¹«Ö÷µ½Íõ×ӵį¥Åä·½°¸¶¼ÊǸø³öµÄ£¬ÊÇÒ»¶¨´æÔڵģ¬ÄÇÊÇÒòΪ¹«Ö÷ºÍÍõ×ӵĸöÊýÊÇÏàͬµÄ¡£
µ«ÊÇÕâµÀÌ⹫Ö÷ºÍÍõ×ӵĸöÊý²»Í¬£¬¾ÍÎÞ·¨×öµ½Á½Á½Æ¥Å䣬±ØÈ»´æÔÚ¹â¹÷µÄÇé¿ö¡£
¹â¹÷ÆäʵͦÕý³£µÄ£¬µ«ÊǶÔÓÚÕâµÀÌ⣬ÎÒÃǾÍÐèÒªÐéÄâһЩÍõ×Ӻ͹«Ö÷³öÀ´¡£
Ò»¸öÍõ×ÓûÓÐÆ¥ÅäµÄ»°£¬ÄÇôÐéÄâÒ»¸ö¹«Ö÷³öÀ´£¬±íʾËùÓеÄÍõ×Ó¶¼Ï²»¶Õâ¸ö¹«Ö÷£¬Í¬ÀíÐéÄâ³öÍõ×ÓµÄÇé¿ö¡£
ÄÇôÔÚÇó³öÆ¥ÅäÖ®ºó£¬ÎÒÃǾͿÉÒÔ¸ù¾ÝÕâЩƥÅäÀ´½¨Á¢¹«Ö÷->Íõ×ӵıߣ¬È»ºó²Ù×÷¾ÍºÍÉÏÒ»ÌâÒ»ÑùÁË¡£
´úÂ룺
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos£¨-1.0£©
#define inf 0x3fffffff
#define LL£¨x£© £¨ x ¡¶ 1 £©
#define bug puts£¨"here"£©
#define PII pair<int,int>
#define RR£¨x£© £¨ x ¡¶ 1 | 1 £©
#define mp£¨a,b£© make_pair£¨a,b£©
#define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£©
#define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £©
using namespace std;
inline void RD£¨int &ret£© {
char c;
int flag = 1 ;
do {
c = getchar£¨£©£»
if£¨c == '-'£©flag = -1 ;
} while£¨c < '0' || c > '9'£© ;
ret = c - '0';
while£¨£¨c=getchar£¨£©£© >= '0' && c <= '9'£©
ret = ret * 10 + £¨ c - '0' £©£»
ret *= flag ;
}
inline void OT£¨int a£© {
if£¨a >= 10£©OT£¨a / 10£© ;
putchar£¨a % 10 + '0'£© ;
}
inline void OT£¨double a£© {
char x[111] ;
sprintf£¨x , "%f" , a£© ;
printf£¨"%s\n",x£© ;
}
inline void RD£¨double &ret£© {
char c ;
int flag = 1 ;
do {
c = getchar£¨£© ;
if£¨c == '-'£©flag = -1 ;
} while£¨c < '0' || c > '9'£© ;
ll fuck1 = c - '0' ;
while£¨£¨c = getchar£¨£©£© >= '0' && c <= '9'£© {
fuck1 = fuck1 * 10 + c - '0' ;
}
ll fuck2 = 1 ;
while£¨£¨c = getchar£¨£©£© >= '0' && c <= '9'£© {
fuck1 = fuck1 * 10 + c - '0' ;
fuck2 *= 10 ;
}
ret = flag * £¨double£©fuck1 / £¨double£©£¨fuck2£© ;
}
/***************************************************/
#define N 2005
int n , m ;
int fk[N] ;
int vis[N] ;
struct kdq {
int s , e , next ;
} ed[N * N] ;
int head[N] , num = 0 ;
int nn ;
int linkx[N] ,linky[N] ;
vector<int>G[N] ;
void add£¨int s ,int e£© {
ed[num].s = s ;
ed[num].e = e ;
ed[num].next = head[s] ;
head[s] = num ++ ;
}
int dfs£¨int now£© {
int sz = G[now].size£¨£© ;
for £¨int i = 0 ; i < sz ; i ++ £© {
int e = G[now][i] ;
if£¨£¡vis[e]£© {
vis[e] = 1 ;
if£¨linky[e] == -1 || dfs£¨linky[e]£©£© {
linky[e] = now ;
linkx[now] = e ;
return 1 ;
}
}
}
return 0 ;
}
//tarjan_define
int low[N] , dfn[N] , st[N] , belong[N] ;
int top , dp ,SCC ;
void tarjan£¨int now£© {
vis[now] = 1 ;
st[top ++ ] = now ;
dfn[now] = low[now] = dp ++ ;
for £¨int i = head[now] ; i != -1 ; i = ed[i].next £© {
int v = ed[i].e ;
if£¨dfn[v] == -1£© {
tarjan£¨v£© ;
low[now] = min£¨low[now] ,low[v]£© ;
} else if£¨vis[v]£© {
low[now] = min£¨low[now] ,dfn[v]£© ;
}
}
if£¨low[now] == dfn[now]£© {
int xx ;
SCC ++ ;
do {
xx = st[-- top ] ;
vis[xx] = 0 ;
belong[xx] = SCC ;
} while£¨xx != now£© ;
}
}
//init
void init£¨£© {
mem£¨linkx ,-1£© ;
mem£¨linky ,-1£© ;
mem£¨vis, 0£© ;
mem£¨low,0£© ;
mem£¨dfn ,-1£© ;
mem£¨st ,0£© ;
mem£¨head ,-1£© ;
num = top = dp = SCC = 0 ;
}
int main£¨£© {
int T ;
#ifndef ONLINE_JUDGE
freopen£¨"D:\\fuck.txt","r",stdin£© ;
#endif
cin ¡· T ;
int ca = 0 ;
while£¨T -- £© {
RD£¨n£© ;
RD£¨m£© ;
int nfk = max£¨m , n£© ;
init£¨£© ;
for £¨int i = 0 ; i <= N ¡· 1 ; i ++ £© {
G[i].clear£¨£© ;
}
REP£¨i , 1 , n £© {
int x ;
RD£¨x£© ;
while£¨x -- £© {
int y ;
RD£¨y£© ;
add£¨i , nfk + y£© ;
G[i].push_back£¨nfk + y£© ;
}
}
nn = 0 ;
for £¨int i = 1 ; i <= nfk ; i ++ £© {
mem£¨vis ,0£© ;
nn += dfs£¨i£© ;
}
nn = 2 * nfk ;
for £¨int i = 1 ; i <= nfk ; i ++ £© { //ÐéÄ⹫Ö÷
if£¨linkx[i] == -1£© {
linkx[i] = ++ nn ;
linky[nn] = i ;