hdu 5952 Counting Cliques 暴力搜索 2016瀋陽區域賽

題目鏈接:hdu 5952 Counting Cliques

題目大意

n≤100 個點,m≤1000 條邊的圖,求大小恰好是 s≤10 的團的數量。

解題思路

因爲題目中已經說了每個點的度不超過20,並且s10 ,我們就可以按照每個節點爲起點進行搜索,只要搜索到了就把答案+1,還有一個問題就是怎麼保證搜索的時候不重複的問題,我們可以額外的申請一個數據結構,判斷當前的節點是不是和已經在這個數據結構裏面的點都有一條邊,如果有就把這個點也加入這個數據結構,知道搜索到在這這個數據結構裏面的點等於S就從下一個點繼續搜索,直至所搜完畢!

AC代碼

#include <cstdio>
#include <cstring>
const int MX = 1e3+5;
int m[MX][MX],head[MX],IN[MX],ans,e;
struct Edge{
    int v,nxt;
}E[MX<<2];
void init()
{
    ans = 0;
    e=0;memset(IN,0,sizeof IN);
    memset(head,-1,sizeof head);
    memset(m,0,sizeof m);
}
void add(int u,int v)
{
    E[e].v =v;
    E[e].nxt = head[u];
    head[u] = e++;
}
void DFS(int siz,int *A,int u,int s)
{
    if(siz==s) {
        ans++;
        return ;
    }
    for(int i=head[u];~i;i=E[i].nxt) {
        int v = E[i].v;  bool flag = true;
        for(int j=1;j<=siz;j++) {
            if(!m[v][A[j]]) {
                flag = false;
                break;
            }
        }
        if(flag) {
            siz++;
            A[siz]  = v;
            DFS(siz,A,v,s);
            siz--;
        }
    }
}
void solve(int n,int s)
{
    for(int i=1;i<=n;i++) {
        int A[MX];memset(A,0,sizeof A);
        A[1] =  i;
        DFS(1,A,i,s);
    }
    printf("%d\n",ans);
}
int main()
{
    int T,N,M,S;freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--) {
        init();
        scanf("%d%d%d",&N,&M,&S);
        while(M--) {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            m[u][v] = m[v][u]  = 1;
        }
        solve(N,S);
    }
    return 0;
}
發佈了215 篇原創文章 · 獲贊 197 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章