P1041 传染病控制
https://www.luogu.org/problem/P1041
#include<bits/stdc++.h> using namespace std; #define int long long #define sc(x) scanf("%lld",&x); const int maxn = 1000; int n,m,tot=1,ans=5000; int c[maxn]; vector<int>son[maxn]; int G[maxn][maxn]; void dfs(int i,int fa) { for(int j=1; j<=n; j++) { int x=G[i][j]; //cout<<i<<' '<<fa<<'\n'; if(x!=0) { x=j; // cout<<i<<" zenmehuishi "<<x<<'\n'; if(x!=fa) { son[i].push_back(x); dfs(x,i); } } } } void solve(int p) { bool f=0; if(ans<=tot) return; for(int i=1; i<=n; i++) { if(c[i]==p) { for(int j=0; j<son[i].size(); j++) { f=1; tot++; c[son[i][j]]=p+1; } } } tot--; for(int i=1; i<=n; i++) { if(c[i]==p+1) { c[i]=0;///剪掉 solve(p+1); c[i]=p+1; } }///儿子的儿子 tot++; for(int i=1; i<=n; i++) { if(c[i]==p+1) { c[i]=0; tot--; } } if(!f)//标记是否有儿子 { ans=min(ans,tot); return; } } signed main() { int x,y; sc(n); sc(m); c[1]=1; for(int i=1; i<=m; i++) { sc(x); sc(y); G[x][y]=1; G[y][x]=1; } dfs(1,-1); /* for(int i=1; i<=n; i++) { cout<<son[i].size()<<' '; }*/ solve(1); cout<<ans<<'\n'; return 0; }