0
点赞
收藏
分享

微信扫一扫

白色相簿 计蒜客

 

如何判断一个图中是否存在三元环 先bfs全图 得到一颗bfs树 然后用O(N+M)的方法遍历全图 若相邻两点且深度相同 那一定存在三元环 因为无论从哪一个点进入三元环 另外两点在bfs树中的深度必然相同

 

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

struct node
{
int v;
int next;
};

queue <int> que;
node edge[6000010];
int first[100010],dfn[100010];
int n,m,num,flag;

void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
return;
}

void bfs()
{
int i,u,v;
while(!que.empty()) que.pop();
memset(dfn,0,sizeof(dfn));
que.push(1);
dfn[1]=1;
while(!que.empty())
{
u=que.front();
que.pop();
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(!dfn[v])
{
dfn[v]=u;
que.push(v);
}
}
}
return;
}

int judge()
{
int i,u,v;
for(u=1;u<=n;u++)
{
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dfn[u]==dfn[v]) return 1;
}
}
return 0;
}

int main()
{
int i,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
bfs();
printf("%d\n",judge());
}
return 0;
}

 


举报

相关推荐

0 条评论