HDU 5952
Posted Psong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5952相关的知识,希望对你有一定的参考价值。
题意:给一个图,给出一个值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\\n",ans); } return 0; }
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\\n",ans); } return 0; }
以上是关于HDU 5952的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 5952 Counting Cliques(DFS)