从某一点开始,以层次遍历的方式建树
若三点a、b、c互相连接,首先必先经过其中一点a,然后a可以拓展b、c两点,b、c两点的高度是相同的,若b(c)拓展时找到高度与之相同的点,则存在三点互相连接
//等等:该算法正确证有待斟酌,我在看到这个方法的增强版,这方法也许有漏洞
//(注:这想法应该是在17年网络同步赛的时候别人想到的(大致是这样),但貌似写的方法跟我不同)
与acm网络同步赛的某道题有点类似(还有那个定理:若人数大于等于六个,至少存在三个人互相认识,或三个人互不认识)
别人的方法在这(https://www.jisuanke.com/minicourse/1249):
/*
从某一点开始,以层次遍历的方式建树
若三点a、b、c互相连接,首先必先经过其中一点a,然后a可以拓展b、c两点,b、c两点的高度是相同的,若b(c)拓展时找到高度与之相同的点,则存在三点互相连接
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std; struct node
{
long d;
struct node *next;
}*point[],*p;
long q[],dep[]; int main()
{
long n,m,i,head,tail,a,b;
scanf("%ld%ld",&n,&m);
for (i=;i<=n;i++)
point[i]=NULL;
for (i=;i<=m;i++)
{
scanf("%ld%ld",&a,&b);
p=(struct node *) malloc (sizeof(struct node));
p->d=a;
p->next=point[b];
point[b]=p; p=(struct node *) malloc (sizeof(struct node));
p->d=b;
p->next=point[a];
point[a]=p;
}
for (i=;i<=n;i++)
dep[i]=-;
//有可能有很多块
for (i=;i<=n;i++)
if (dep[i]==-)
{
q[]=i; dep[i]=;
head=;
tail=;
while (head<tail)
{
head++;
p=point[q[head]];
while (p)
{
if (dep[p->d]==-)
{
tail++;
q[tail]=p->d;
dep[p->d]=dep[q[head]]+;
}
else if (dep[p->d]==dep[q[head]])
{
printf("");
return ;
}
p=p->next;
}
}
}
printf("");
return ;
}