7.最大团问题


title: 最大团问题
date: 2023-03-31 10:37:41
categories:

  • 大学课程内容
  • 大二下
  • 算法分析基础
    swiper_index: 10

7.最大团问题

【问题描述】

给定一个无向图G=(V,E),若U为V子集,请对任意的顶点u, v为U的元素,有边(u,v)为E元素,则称U为G的一个完全子图。G的完全子图U是一个团,当且仅当U不包含在G的更大的完全子图中。G的最大团则指包含定点数最多的团。对给定的无向图,找出最大团中顶点的个数。

【输入形式】

G的邻接矩阵

【输出形式】

第一行输出最大团顶点个数,第二行输出最大团中的顶点

【样例输入】

0,1,1,0,0

1,0,1,1,1

1,1,0,1,1

0,1,1,0,1

0,1,1,1,0

【样例输出】

最大团顶点个数: 4

最大团为: [0, 1, 1, 1, 1]

【样例说明】

输入的邻接矩阵表明图中有5个顶点,矩阵元素为1,则行、列对应的顶点有边相连,否则没有边相连。矩阵元素之间通过逗号隔开。举例:假设5个顶点分别为ABCDE,那么A与B、C相连。最终求得,最大团中包含4个节点,为BCDE。

完全图

任意两点都恰有一条边相连的图,n个顶点的图中有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1) 条边。

完全子图(团)

任意两点都恰好有一条边相连的子图,也叫团。

思路

每次看当前点u如果他和最大团中的点没有边的话就不加,如果都有边的话,那么就加进去。

代码

graph = []
while True:
    try:
        graph.append(list(map(int, input().split(","))))
    except:
        break

n = len(graph[0])
# 用于存储最大团的点集
ans = [0 for _ in range(n)]
# 用于存储当前团的点集
st = [0 for _ in range(n)]
res = 1


def dfs(u, num):
    global res, ans, n
    if u == n:
        if num > res:
            res = num
            ans = st[:]
        return
    flag = True
    for i in range(n):
        if st[i] == 1 and graph[u][i] == 0:
            flag = False
            break
    if flag:
        st[u] = 1
        dfs(u + 1, num + 1)
        st[u] = 0
        dfs(u + 1, num)
    else:
        dfs(u + 1, num)


dfs(0, 0)
print("最大团顶点个数: {}".format(res))
print("最大团为: {}".format(ans))

三组测试数据如下

# Test1
0, 1, 1, 0, 0
1, 0, 1, 1, 1
1, 1, 0, 1, 1
0, 1, 1, 0, 1
0, 1, 1, 1, 0
# Result1
最大团顶点个数: 4
最大团为: [0, 1, 1, 1, 1]

# Test2
0, 1, 1, 1
1, 0, 1, 1
1, 1, 0, 1
1, 1, 1, 0
# Result2
最大团顶点个数: 4
最大团为: [1, 1, 1, 1]

# Test3
0, 1, 0, 0, 0, 1
1, 0, 1, 1, 1, 1
0, 1, 0, 1, 1, 0
0, 1, 1, 0, 1, 0
0, 1, 1, 1, 0, 1
1, 1, 0, 0, 1, 0
# Result3
最大团顶点个数: 4
最大团为: [0, 1, 1, 1, 1, 0]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重生之我是cxk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值