1. 程式人生 > >HDU - 5952 Counting Cliques (dfs)

HDU - 5952 Counting Cliques (dfs)

-- wap open col set cst play bsp sca

題目鏈接: Counting Cliques

題意:一個有N個點M條邊的圖,球其中由S個點構成的團的個數。一個團是一個完全子圖。

題解:拿到這題想了好久。。沒想到dfs就完事了。就dfs一下,回溯一下就ok了,銅牌題。

技術分享圖片
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set
> #include <map> #include <math.h> using namespace std; #define LL long long #define fi first #define se second #define pb(a) push_back(a) const int MAX_N = 1e2+7; const LL mod = 1e9+7; const int inf = 0x3f3f3f3f; int N,M,T,S; int ans; vector<int> vec[MAX_N]; int mp[MAX_N][MAX_N];
void dfs(int pos,int *sta ,int num){ if(num == S){ ans ++; return ; } for(int i=0;i<vec[pos].size();i++){ int t = vec[pos][i]; bool f = true; for(int j=0;j<num;j++){ if(mp[t][sta[j]] == 0){ f = false;
break; } } if(f){ sta[num ++] = t; dfs(t,sta,num); sta[num-1] = 0; num --; } } } int main() { cin>>T; while(T--) { ans = 0; for(int i=0;i<MAX_N;i++){ vec[i].clear(); } memset(mp,0,sizeof(mp)); scanf("%d%d%d",&N,&M,&S); for(int i=0;i<M;i++){ int a,b; scanf("%d%d",&a,&b); if(a > b) swap(a,b); vec[a].push_back(b); mp[a][b] = mp[b][a] = 1; } for(int i=1;i<=N;i++){ int sta[MAX_N]; sta[0] = i; dfs(i,sta,1); } printf("%d\n",ans); } return 0; }
View Code

HDU - 5952 Counting Cliques (dfs)