POJ(2942)(Knights of the Round Table )

链接:https://vjudge.net/problem/POJ-2942
思路:本来算是一个多个算法的综合模板题,但是我不熟悉就拿来熟悉模板了,大概就是先用tarjan求出双连通分量,然后利用二分图对每个分量染色,并将能成功染色(必定为奇圈)的顶点标记,最后没标记的点就不能参加会议
代码:

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

const int maxn = 1001;
vector G[1001],bcc[1001];
int odd[1001],color[1001];
int dfn[1001];
int low[1001];
int iscut[1001];
int bccno[1001];
int ntime;
int n,m,bcc_cnt;

struct edge{
    int u,v;
    edge(){}
    edge(int uu,int vv):u(uu),v(vv){}
};

deque edges;

//tarjan模板
void tarjan(int u,int f){
    int i,j,k;
    int child = 0;
//low在这里代表非父边所能连到的最早的结点的时间(与求强连通分量时候的low数组意思不一样,一定注意!),dfn表示该结点的开始搜索时间,初始时间dfn等于low
    low[u] = dfn[u] = ++ntime;
    for(i=0;i

你可能感兴趣的:(POJ(2942)(Knights of the Round Table ))