题目:
背景知识:
在计算机科学领域,一个图是由若干个节点和连接这些节点的线段所组成,例如图一所示的图由4个节点组成和5条线段组成。节点分别是节点1、节点2、节点3、节点4。线段分别为 (节点1, 节点2)、(节点1, 节点3)、(节点1, 节点4)、(节点2, 节点3)、(节点2, 节点4)。
图1:一个图的例子
在图中,一个团(clique)指的是这个图中存在一个由若干个点组成的子图,在这个子图里,所有的点每两两之间都被线段所连接。如图一中总共有两个3节点团,分别是:(节点1, 节点2,节点4)和(节点1、节点2、节点3)。又例如下图2中总共有四个3节点团,分别是:(节点1、节点2、节点4)、(节点1、节点2、节点3)、(节点1、节点3、节点4)、(节点2、节点2、节点4);和一个4节点团:(节点1、节点2、节点3、节点4)。
图2:图的例子,该图存在四个3节点团和一个四节点团
题干:已知一个图有9个节点,并且有如下22条线段连接关系:
(节点2, 节点3), (节点1, 节点2), (节点7, 节点5), (节点3, 节点4), (节点4, 节点6), (节点4, 节点7), (节点1, 节点3), (节点1, 节点5), (节点5, 节点6), (节点2, 节点5), (节点6, 节点7), (节点2, 节点7), (节点3, 节点5), (节点1, 节点4), (节点8, 节点1), (节点9, 节点1), (节点8, 节点9), (节点3, 节点8), (节点7, 节点1), (节点9, 节点2), (节点8, 节点2), (节点7, 节点3)
请找出这个图中所有的3节点团、4节点团和5节点团。
#include <stdio.h>
int main()
{int line[9][9]={0};/*定义线段*/
int n;/*n节点团*/
line[0][1]=line[0][2]=line[0][3]=line[0][4]=line[0][6]=line[0][7]=line[0][8]=1;
line[1][2]=line[1][4]=line[1][6]=line[1][7]=line[1][8]=line[2][3]=line[2][4]=1;
line[2][6]=line[2][7]=line[3][5]=line[3][6]=line[4][5]=line[4][6]=line[5][6]=1;
line[7][8]=1;
line[1][0]=line[2][0]=line[3][0]=line[4][0]=line[6][0]=line[7][0]=line[8][0]=1;
line[2][1]=line[4][1]=line[6][1]=line[7][1]=line[8][1]=line[3][2]=line[4][2]=1;
line[6][2]=line[7][2]=line[5][3]=line[6][3]=line[5][4]=line[6][4]=line[6][5]=1;
line[8][7]=1;/*共22线段,44数组*/
printf("请输入要查询的n节点团,n=");
scanf("%d",&n);
if(n<3)
printf("无%d节点团",n);
if(n>5)
printf("无%d节点团",n);
if(n==3)
{int a,b,count,c;//设该三节点团为(a,b,c)
a=0,b=1,c=2,count=0 ;
printf("三节点团有:\n");
for (;a<9;a++)
{
for (;b<9;b++)
{
for(;c<9;c++)
{if(line[a][b]==1&&line[a][c]==1&&line[b][c]==1&&a<b&&b<c)
{printf("(%d,%d,%d)\n",a+1,b+1,c+1);
count++;}
}
c=2;
}
b=1;
c=2;
}printf("共%d个三节点团",count);
}
if(n==4)
{int a,b,c,d,count;
printf("四节点团有:\n");
a=0,b=1,c=2,d=3,count=0;
for(;a<9;a++)
{for(;b<9;b++)
{for(;c<9;c++)
{for(;d<9;d++)
if(line[a][b]==1&&line[a][c]==1&&line[b][c]==1&&line[a][d]&&line[b][d]&&line[c][d]&&a<b&&b<c&&c<d)
{printf("(%d,%d,%d,%d)\n",a+1,b+1,c+1,d+1);
count++;
}
d=3;
}
d=3;
c=2;
}
d=3;
c=2;
b=1;
}
printf("共%d个四节点团",count) ;
}
if(n==5)
{int a,b,c,d,e,count;
printf("五节点团有:\n");
a=0,b=1,c=2,d=3,e=4,count=0;
for(;a<9;a++)
{for(;b<9;b++)
{for(;c<9;c++)
{for(;d<9;d++)
{for(;e<9;e++)
{if(line[a][b]==1&&line[a][c]==1&&line[b][c]==1&&line[a][d]&&line[b][d]&&line[c][d]&&line[a][e]&&line[b][e]&&line[c][e]&&line[d][e]&&a<b&&b<c&&c<d&&d<e)
{printf("(%d,%d,%d,%d,%d)\n",a+1,b+1,c+1,d+1,e+1);
count++;
}
}
e=4;
}
d=3;
e=4;
}
d=3;
c=2;
e=4;
}
d=3;
c=2;
b=1;
e=4;
}
printf("共%d个五节点团",count) ;
}
return 0;
}
运行结果: