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

来源:互联网 发布:java中设计模式详解 编辑:程序博客网 时间:2024/05/21 17:13

点击进入异世界


前排膜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.csdn.net/loi_peacefuldog

1 0