poj2942 解題報告

2021-06-10 08:34:46 字數 1679 閱讀 7671

本來想下午做完了週末好好玩,結果尼瑪做了一晚上...

題意:亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求:

1、  相互憎恨的兩個騎士不能坐在直接相鄰的2個位置;

2、  出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。

如果出現有某些騎士無法出席所有會議(例如這個騎士憎恨所有的其他騎士),則亞瑟王為了世界和平會強制把他剔除出騎士團。

現在給定準備去開會的騎士數n,再給出m對憎恨對(表示某2個騎士之間使互相憎恨的),問亞瑟王至少要剔除多少個騎士才能順利召開會議

( 我找網上的題意,自己說不清楚 )

題解:1,將圖求反,就是把有的邊去掉,將沒有的添上

2,找到雙連通塊

3,在雙連通塊中找是否存在奇圈,若存在則塊中的騎士都可以開會的

4,統計有多少騎士不能存在在大於1的奇圈中的

**:

#include #include #include #include #include using namespace std ;

const int maxn = 1005 ;

const int maxm = maxn * maxn * 2 ;

struct type

;type edge[maxm] ;

int head[maxn] , count , mark[maxn] ;

int low[maxn] , dfn[maxn] , vis[maxn] ;

int map[maxn][maxn] , num[maxn] , belone[maxn] ;

int color[maxn] ;

stack < int > stack ;

void addedge( int start , int end )

int bfs( int cur , int from )

else if( color[end] == color[temp] ) return 1 ;}}

return 0 ;

}void tarjan_dfs( int cur , int father , int & cnt , int & time )

while( temp != end ) ;

num[cnt] = cur ;

belone[cur] = cnt ;

cnt ++ ;

if( bfs( cur , cnt ) )}}

}else low[cur] = min( low[cur] , dfn[end] ) ;

}}int tarjan( int n )

return cnt ;

}int main()

for( i = 1 ; i <= n ; i ++ )

for( j = 1 ; j <= n ; j ++ )

int ans = 0 ;

int temp = tarjan( n ) ;

for( i = 1 ; i <= n ; i ++ )

if( mark[i] == 0 ) ans ++ ;

printf( "%d\n" , ans ) ;

}return 0 ;

}

**修修改改好多次才過的,所以很挫....

poj2942解題報告

這道題其實就是求割點數量 用點雙聯通 include include include include using namespace std const int maxn 1001 const int maxm 2 maxn maxn const int inf 99999999 struct ty...

poj 2942 點雙聯通

題意 亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求 1 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置 2 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。如果出現有某些騎士無法出席所有會議 例...

POJ 2942 點雙連通

自己試著敲試試 莫名奇妙的過了,我還是要好好研究原理。點雙聯通 每個點與其他點都至少有兩條路徑。include include include include include include include define maxn 1020 define maxm 1000010 using nam...