【DFS】CODE[VS] 1091 传染病控制

本文介绍了一种使用暴力搜索结合邻接表建图的方法来解决特定类型的搜索问题。通过预处理深度信息,该方法能够在遇到无子节点的情况时有效回溯,主要考验的是代码实现能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击进入异世界


前排膜DQS


真·暴力

暴力邻接表建图,然后按轶搜索(预处理出深度),搜到没有儿子时返回

搜索这类题,思想都没什么难度,主要考察代码能力(QAQ)

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> 

const int maxn = 5005;

using namespace std;

int n,p;
int tot;
int head[maxn];
int rank[maxn],fa[maxn];
bool used[maxn];
bool gun[maxn];
int ans = 0x3ffffff;

struct node{
    int f,t,next;
}e[maxn << 3];

inline int read()
{
    int f = 1;
    int data = 0;
    char ch;
    while(ch < '0'||ch > '9')
    {
        ch = getchar();
        if(ch == '-') {f = -1;}
    }
    do
    {
        data = data*10+ch-'0';
        ch = getchar();
    }while(ch >= '0'&&ch <= '9');

return f*data;
}

inline void build(int x,int y)
{
    tot += 1;
    e[tot].f = x;
    e[tot].t = y;
    e[tot].next = head[x];
    head[x] = tot;
}

inline void dfsrank(int x)
{
    if(used[x])return;
    used[x]=1;
    for(int i = head[x];i;i = e[i].next) 
    {
        int u = e[i].t;
        if(used[u] == 0)
        {
            fa[u] = x;
            rank[u] = rank[x]+1;
            dfsrank(u);
        }
    }
}

inline void violent(int c,int sum)
{
    bool hson = 1;
    if(sum >= ans)return;
    for(int i = 1;i <= n;i++)
    {
        if(rank[i] == c&&gun[i] == 1)
        {
            for(int j = head[i];j;j = e[j].next)
            {   
                int u = e[j].t;
                if(fa[u] == i)
                {
                    hson = 0;
                    gun[u] = 1;
                    sum++;
                }
            }
        }   
    }   
    for(int i = 1;i <= n;i++)
    {
        if(rank[i] == c+1&&gun[i])
        {
            sum--;
            gun[i] = 0;
            violent(c+1,sum);
            gun[i] = 1; 
            sum++;
        }
    }
    for(int i = 1;i <= n;i++)
        if(rank[i] == c&&gun[i])
        {
            for(int j = head[i];j;j = e[j].next)
            {
                int u = e[j].t;
                if(fa[u] == i)
                {
                    gun[u] = 0;
                    sum--;
                }
            }
        }
    if(hson == 1) 
        ans = min(ans,sum);
}

int main()
{
    n = read();
    p = read();
    for(int i = 1;i <= p;i++)  
    {
        int a,b;
        a = read();
        b = read();
        build(a,b);
        build(b,a);
    }
    rank[1] = 1;
    gun[1] = 1;
    dfsrank(1);
    violent(1,1);
    printf("%d",ans);
return 0;
}

THE END

强无敌

By Peacefuldoge

http://blog.youkuaiyun.com/loi_peacefuldog

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值