這道題其實就是求割點數量
用點雙聯通
#include #include #include #include using namespace std ;
const int maxn = 1001 ;
const int maxm = 2*maxn * maxn ;
const int inf = 99999999 ;
struct type
; type edge[maxm] ;
int head[maxn] , count , map[maxn][maxn] , vis[maxn] , visit[maxn] , low[maxn] , dfn[maxn] ;
int color[maxn] , belone[maxn] , val[maxn] , ans , cnt , time , flag ;
stack < int > s ;
void addedge( int start , int end )
void dfs( int root , int col )
}void tarjan_dfs( int cur , int father )
while( ss != end ) ;
belone[cur] = cnt ;
val[++ans] = cur ;
flag = 0 ;
memset( color , -1 , sizeof( color ) ) ;
dfs( cur , 0 ) ;
if( flag ) for( int j = 1 ; j <= ans ; j ++ )
vis[val[j]] = 1 ;
}} else low[cur] = min( low[cur] , dfn[end] ) ; }}
int main()
for( i = 1 ; i <= n ; i ++ )
for( j = i + 1 ; j <= n ; j ++ )
if( ! map[i][j] )
cnt = 0 ; time = 0 ;
memset( vis , 0 , sizeof( vis ) ) ;
memset( visit , 0 , sizeof( visit ) ) ;
memset( belone , -1 , sizeof( belone ) ) ;
for( int i = 1 ; i <= n ; i ++ )
if( ! visit[i] ) tarjan_dfs( i , -1 ) ;
sum = 0 ;
for( int i = 1 ; i <= n ; i ++ )
if( vis[i] ) sum ++ ;
printf( "%d\n" , n - sum ) ;
} return 0 ;
}
poj2942 解題報告
本來想下午做完了週末好好玩,結果尼瑪做了一晚上.題意 亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求 1 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置 2 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都...
poj 2942 點雙聯通
題意 亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求 1 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置 2 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。如果出現有某些騎士無法出席所有會議 例...
POJ 2942 點雙連通
自己試著敲試試 莫名奇妙的過了,我還是要好好研究原理。點雙聯通 每個點與其他點都至少有兩條路徑。include include include include include include include define maxn 1020 define maxm 1000010 using nam...