zoukankan      html  css  js  c++  java
  • HDU 5952

    HDU 5952 Counting Cliques

    题意:给一个图,给出一个值s,问这个图里面有多少个s条边的完全图。

    题解:直接dfs,因为每个点最多只有20个出度,只是在记录时需要单向记录,dfs的时候也就从前往后扫了。现在终于知道当时T掉的原因了。。。原来记录点时set改成数组就不会超时了。纪念一发。

    正确代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <set>
    using namespace std;
    int n,m,S,ans,cnt;
    int a[105][105];
    vector<int> g[105];
    int s[1005];
    void dfs(int u){
        if(cnt==S){
            ans++;
            return;
        }
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i];
            int flag=0;
            for(int j=1;j<=cnt;j++){
                if(a[v][s[j]]==0){
                    flag=1;
                    break;
                }
            }
            if(flag==0){
                cnt++;
                s[cnt]=v;
                dfs(v);
                cnt--;
            }
        }
        return;
    }
    int main(){
        int t; scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&n,&m,&S);
            memset(a,0,sizeof(a));
            for(int i=1;i<=n;i++)
                g[i].clear();
            ans=0; cnt=0;
    
            for(int i=1;i<=m;i++){
                int x,y;
                scanf("%d%d",&x,&y);
                a[x][y]=1;
                a[y][x]=1;
                if(x>y) swap(x,y);
                g[x].push_back(y);
            }
            for(int i=1;i<=n;i++){
                cnt=0;
                s[++cnt]=i;
                dfs(i);
            }
            printf("%d
    ",ans);
        }
    
        return 0;
    }
    Psong

    T掉的代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <set>
    using namespace std;
    int n,m,S,ans;
    int a[1005][1005];
    int vis[1005];
    vector<int> g[1005];
    set<int> s;
    void dfs(int u){
        s.insert(u);
        if(s.size()==S){
            ans++;
            s.erase(u);
            return;
        }
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i];
            set<int>::iterator it;
            int flag=0;
            for(it=s.begin();it!=s.end();it++){
                if(a[v][*it]==0){
                    flag=1;
                    break;
                }
            }
            if(flag==0){
                dfs(v);
            }
        }
        s.erase(u);
        return;
    }
    int main(){
        int t; scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&n,&m,&S);
            memset(vis,0,sizeof(vis));
            memset(a,0,sizeof(a));
            for(int i=1;i<=n;i++)
                g[i].clear();
            s.clear();
            ans=0;
    
            for(int i=1;i<=m;i++){
                int x,y;
                scanf("%d%d",&x,&y);
                a[x][y]=1;
                a[y][x]=1;
            }
            for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++){
                if(a[i][j]==1)
                    g[i].push_back(j);
            }
    
            for(int i=1;i<=n;i++)
                if(!vis[i]) dfs(i);
            printf("%d
    ",ans);
        }
    
        return 0;
    }
    Psong
  • 相关阅读:
    Codeforces 每日一练 1213G+961E+1282B2
    AtCoder Beginner Contest 161题解
    Codeforces每日一练 495B+55C+1280C
    CF1062E 线段树/LCA
    Codeforces Round #697 (Div. 3) 题解
    Codeforces Round #511 (Div. 2) A~D题解
    Atcoder ABC 189 题解
    CF1093G 高维曼哈顿距离/线段树
    CF1117D Magic Gems 矩阵快速幂 DP
    CF1106E Lunar New Year and Red Envelopes DP
  • 原文地址:https://www.cnblogs.com/N-Psong/p/6014351.html
Copyright © 2011-2022 走看看