寻找节点团个数

题目:

背景知识:

在计算机科学领域,一个图是由若干个节点和连接这些节点的线段所组成,例如图一所示的图由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;	
		}	

​

 运行结果:

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值