本來想下午做完了週末好好玩,結果尼瑪做了一晚上...
題意:亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求:
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...