POJ 2942

Posted blogoflyn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2942相关的知识,希望对你有一定的参考价值。

坑爹题

圆桌骑士可以有好多桌子就算了,骑士可以分身???同时在好多桌子???

害得我卡了一个小时。。。

正解:双联通分量,交叉染色判二分图!!

结束

(貌似双联通分量不需要开个栈维护边)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int Maxn=1010,Maxm=1000010;
struct edge{
int v,nxt;
}e[Maxm*2];
int n,m,tot,ans,top,head[Maxn],dfn[Maxn],low[Maxn],col[Maxn],st[2*Maxm];
bool hate[Maxn][Maxn],vis[Maxn],cntd[Maxn],sta[Maxn];
int q[Maxn];
void addedge(int u,int v){
e[tot].v=v;
e[tot].nxt=head[u];
head[u]=tot++;
}
int count(){
int i,sum=0;
for(i=0;i<n;i++)if(sta[i]&&!cntd[i]){
cntd[i]=1;
sum++;
}
return sum;
}
int judge(int s){
int front=0,tail=0;
memset(col,-1,sizeof(col));
q[tail++]=s;
col[s]=0;
while(front!=tail){
int u=q[front++];
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].v;
if(!sta[v])continue;
if(~col[v]&&col[v]==col[u])return count();
if(col[v]==-1){
q[tail++]=v;
col[v]=(col[u]^1);
}
}
}
return 0;
}
void tarjan(int depth,int f,int u){
dfn[u]=low[u]=depth;
vis[u]=1;
st[++top]=u;
int i;
for(i=head[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==f)continue;
if(vis[v]){low[u]=min(low[u],dfn[v]);continue;}
tarjan(depth+1,u,v);
low[u]=min(low[u],low[v]);
if(low[v]==depth){
memset(sta,0,sizeof(sta));
while(st[top]!=u){
sta[st[top--]]=1;
}sta[st[top]]=1;
ans+=judge(u);
}
}
if(low[u]==depth)top--;
}
int main(){
while(scanf("%d%d",&n,&m)){
if(!n&&!m)break;
tot=0;
memset(hate,0,sizeof(hate));
memset(cntd,0,sizeof(cntd));
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
top=0;
int i,j;
for(i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
a--,b--;
hate[a][b]=hate[b][a]=1;
}
for(i=0;i<n;i++)for(j=0;j<n;j++)if(i!=j&&!hate[i][j])addedge(i,j);
ans=0;
for(i=0;i<n;i++)if(!vis[i])tarjan(0,-1,i);
printf("%d\n",n-ans);
}
return 0;
}

以上是关于POJ 2942的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2942Knights of the Round Table(双联通分量+染色判奇环)

poj 2942 Knights of the Round Table - Tarjan

poj2942 Knights of the Round Table

poj2942:Knights of the Round Table——题解

poj2942 点-双联通+二分图染色

POJ 2942 Knights of the Round Table 黑白着色+点双连通分量