查了很多资料,看了很多课件..
这种NP难问题.. 确实什么轻易的解法... 长路漫漫。
直接求最大独立集的方法能写了,最大团怎么求呢?
另外吐槽一句:网上很多题解中都有最大独立集=补图的最大团。这没错。
但是,很多都有一句下面是求最大团的代码.. 我去.. 概念清楚了再来写题解好么.. 吐槽完毕.
#include<iostream>
using namespace std;int N,M;
struct Edge
{int v,next;
}E[111111];int ptr[111],ans,Edgenum,set[111],f[111];
int len;void addEdge( int u,int v )
{E[Edgenum].v=v;E[Edgenum].next=ptr[u];ptr[u]=Edgenum++;
}void dfs( int cur ,int num )
{if( cur>N ){if( num>ans ){ans=num;len=0;for( int i=1;i<=N;i++ )if( set[i] )f[len++]=i;}return ;}bool flag=1;for( int i=ptr[cur];i!=-1;i=E[i].next ){if( set[E[i].v] ){flag=0;break;}}if( flag ){set[cur]=1;dfs(cur+1,num+1);set[cur]=0;}if( num+(N-cur)>ans )dfs( cur+1,num );
}int main()
{int T;scanf( "%d",&T );while( T-- ){memset( ptr,-1,sizeof(ptr) );memset( set,0,sizeof(set) );ans=0;Edgenum=0;scanf( "%d %d",&N,&M );for( int i=0;i<M;i++ ){int u,v;scanf( "%d %d",&u,&v );addEdge( u,v );addEdge( v,u );}dfs(1,0);printf( "%dn",ans );printf( "%d",f[0] );for( int i=1;i<len;i++ )printf( " %d",f[i] );printf( "n" );}return 0;
}
本文发布于:2024-02-02 07:58:37,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170683191842435.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |