hdu 5952

来源:互联网 发布:更相减损术算法 编辑:程序博客网 时间:2024/06/16 12:21

题目链接:点击打开链接


题解思路:一开始直接每个枚举T了,后来直接找有连接的居然过了 = =。每次看这个点是否能加入这个团,然后分加入和不加入两种情况dfs就可以了。


代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mx = 1e2+10;int n,m,k,top,ans,tot,head[mx*10];bool edge[mx][mx];int num[mx];struct node{    int y;    int nxt;    node(){}    node(int yy,int nx):y(yy),nxt(nx){}}Edge[mx*20];void AddEdge(int x,int y){    Edge[tot] = node(y,head[x]);    head[x] = tot++;}bool check(int x){    for(int i=0;i<top;i++)    if(!edge[x][num[i]]) return 0;    return 1;}void dfs(int x){    if(top==k)    {        ans++;        return ;    }    for(int i=head[x];~i;i=Edge[i].nxt){        int son = Edge[i].y;        if(!check(son)) continue;        num[top++] = son;        dfs(son);        top--;    }}int main(){    int t;    scanf("%d",&t);    while(t--){       scanf("%d%d%d",&n,&m,&k);       int a,b;       tot = top = ans = 0;       memset(edge,0,sizeof(edge));       memset(head,-1,sizeof(head));       for(int i=0;i<m;i++){            scanf("%d%d",&a,&b);            edge[a][b] = edge[b][a] = 1;            if(a>b) swap(a,b);            AddEdge(a,b);       }       for(int i=1;i<=n;i++){            num[0] = i;            top = 1;            dfs(i);       }       printf("%d\n",ans);    }    return 0;}


原创粉丝点击