DFS 深度优先搜索
P1036 选数
#include<bits/stdc++.h>
using namespace std;
int n,s=0,k;
int ans;
int a[20];
int sushu(int q){//判断素数
int n;
// 1 2 3
if (q <= 3) return q >= 2;
for(n=2;n<=sqrt(q);n++){
if(q%n==0){
return 0;
}
}
return 1;
}
void dfs(int st,int c , int sum){
if(st == n + 1){
if (c != k) return ;
if (sushu(sum) == 0) return ;
ans++;
return ;
}
// 选
dfs (st + 1 , c + 1 , sum + a[st]);
// 不选
dfs (st + 1 , c , sum);
}
int main(){
int i;
cin>>n>>k;
for(i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,0,0);
cout<<ans;
return 0;
}
P1706 全排列问题
#include<bits/stdc++.h>
using namespace std;
int n,s=0,k;
int ans[20]={0};
int use[20]={0};
void dfs(int st){
int i,j;
if(st>=n+1){
for(i=1;i<=n;i++){
cout<<" "<<ans[i];
}
cout<<endl;
}
for(j=1;j<=n;j++){
if(use[j]==0){
use[j]=1;
ans[st]=j;
dfs(st+1);
use[j]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
图,联通块
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
vector<int> e[maxn];
int s=0;
int bk[maxn];
void dfs(int u)
{
if(bk[u]==1)
return ;
bk[u] = 1;
for(auto g:e[u])//遍历所有与u联通的
dfs(g);
}
int main()
{
int n , m; cin >> n >> m;
for (int i = 1 ; i <= m ; i++){
int x , y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(bk[i]==1) continue;
dfs(i);
s++;
}
cout<<s;
return 0;
}