P1041 传染病控制

Posted liulex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于P1041 传染病控制的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1041 传染病控制

P1041 传染病控制(dfs)

P1041 [2003NOIP提高组]传染病控制

洛谷 P1041 传染病控制

P1041 传染病控制

P1041 传染病控制 深搜