您的位置:首页 > 其它

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

2016-11-10 12:11 302 查看
点击进入异世界

前排膜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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs 搜索