zoukankan      html  css  js  c++  java
  • 洛谷1041 传染病控制

    原题链接

    爆搜题。
    有个很显然的贪心,就是第(i)轮扩展肯定是删去(i)(i + 1)层上的某一条边。
    另外,贪心地删除含子节点最多的点是错误的,比如一条很长的链和一个比链节点少一点但是全部分布在一层,这样就是错误的。
    所以我们爆搜的枚举删去这一层的哪个点,并累加上以该点为根的子树大小,然后继续搜下一层,同时将上一层被删去的点扩展到这一层,即上一层被删去的点所在子树都不会被感染,按层标记下来。
    每次搜索的结果就是(n)减去所有被删去的点,答案对每次搜索结果取(min)即可。

    #include<cstdio>
    using namespace std;
    const int N = 310;
    const int M = 620;
    int fi[N], di[M], ne[M], de[N][N], L[N], fa[N], si[N], l, mi = 1e9;
    bool v[N];
    inline int re()
    {
    	int x = 0;
    	char c = getchar();
    	bool p = 0;
    	for (; c < '0' || c > '9'; c = getchar())
    		p |= c == '-';
    	for (; c >= '0' && c <= '9'; c = getchar())
    		x = x * 10 + c - '0';
    	return p ? -x : x;
    }
    inline int minn(int x, int y) { return x < y ? x : y; }
    inline void add(int x, int y)
    {
    	di[++l] = y; ne[l] = fi[x]; fi[x] = l;
    	di[++l] = x; ne[l] = fi[y]; fi[y] = l;
    }
    void dfs_1(int x, int f, int d)//初始化子树大小、该层的节点和每个点的父亲。
    {
    	int i, y;
    	si[x] = 1;
    	de[d][++L[d]] = x;
    	fa[x] = f;
    	for (i = fi[x]; i; i = ne[i])
    		if ((y = di[i]) ^ f)
    		{
    			dfs_1(y, x, d + 1);
    			si[x] += si[y];
    		}
    }
    void dfs_2(int nw, int s)
    {
    	mi = minn(mi, s);
    	if (!L[nw])
    		return;
    	int i, x, k = 0;
    	for (i = 1; i <= L[nw]; i++)//扩展被删去的点
    		if (v[fa[x = de[nw][i]]])
    			v[x] = 1, k++;
    	if (!(k ^ L[nw]))//如果这一层均被删去,那么就不用往下搜了
    		return;
    	for (i = 1; i <= L[nw]; i++)//枚举删点
    	{
    		x = de[nw][i];
    		if (v[x])
    			continue;
    		v[x] = 1;
    		dfs_2(nw + 1, s - si[x]);
    		v[x] = 0;
    	}
    	for (i = 1; i <= L[nw]; i++)//回溯
    		if (v[fa[x = de[nw][i]]])
    			v[x] = 0;
    }
    int main()
    {
    	int i, x, y, n, m;
    	n = re(); m = re();
    	for (i = 1; i <= m; i++)
    	{
    		x = re(); y = re();
    		add(x, y);
    	}
    	dfs_1(1, 0, 1);
    	dfs_2(2, n);
    	printf("%d", mi);
    	return 0;
    }
    
  • 相关阅读:
    LOAD XML
    LOAD DATA
    INSERT 插入语句
    keras第一课
    android系统开发之开启启动
    Qt使用数据库
    微信订阅号案例之一
    python_install
    QtObject使用
    Qml_JS文件的使用
  • 原文地址:https://www.cnblogs.com/Iowa-Battleship/p/10187571.html
Copyright © 2011-2022 走看看