| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:最大团问题,想要求出最大团的所有可能解,但运行程序后只出来一种可能解
只看楼主 加入收藏
swchvs
Rank: 2
等 级:论坛游民
威 望:2
帖 子:53
专家分:81
注 册:2015-2-21
结帖率:25%
收藏
 问题点数:0 回复次数:0 
最大团问题,想要求出最大团的所有可能解,但运行程序后只出来一种可能解
给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。

# include<stdio.h>            
# define N 5

int edge[N][N]={
    {0,1,0,1,1},                        //0表示两点之间不相连,1表示两点之间相连        
        {1,0,1,0,1},
    {0,1,0,0,1},
    {1,0,0,0,1},
    {1,1,1,1,0},
};
int x[N],best[N];
int bestm=0,m=0,max=0;

int place(int k)
{
    for(int i=0;i<k;i++)
    {
            if(x[k]&&edge[i][k]!=1)
                return 0;
    }
    return 1;
}

void print()
{
    if(m>=bestm)
    {
        bestm=m;
        for(int i=0;i<N;i++)
        {
        best[i]=x[i];
        }
    }   
}

void backtrack(int t)
{
    if(t>=N)
    {
        print();
        return;
    }
    for(int i=0;i<=1;i++)
    {
        x[t]=i;   
        if(i==0)
           backtrack(t+1);
        else
        {
            if(place(t))
            {
                x[t]=1;
                m++;
                backtrack(t+1);
                m--;
            }
        }
    }
        
}

void main()
{
    backtrack(0);
    printf("最大团顶点数:%d\n",bestm);
    printf("最大团:");
    for(int i=0;i<N;i++)
        printf("%d ",best[i]);
    printf("\n");
}
搜索更多相关主题的帖子: 运行程序 include 元素 
2015-02-23 14:05
快速回复:最大团问题,想要求出最大团的所有可能解,但运行程序后只出来一种可能 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060709 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved