poj2942解題報告

2021-06-10 06:03:07 字數 1465 閱讀 3894

這道題其實就是求割點數量

用點雙聯通

#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...