P1041题解

题目链接

算法:搜索

第一次看到这道题的解法时我也不相信这能过,但搜索题最奇妙的就是这一点.这道题从正面想比较难,我们考虑把减掉一条边改为把这一个子树的人"救下".这样我们写dfs时直接维护最大的存活数就可以.同时我们尽量将这个图转为一棵树,这里推荐dijikstra,因为比较好写.

那么我们将图转为树后只需维护层级就可以,因为想象一下我们什么都不做病毒会一层一层往下扩散,因此距离根节点的距离就是这个节点会在哪一时刻被感染.所以我们现在可以操作后只能每次救一个子树的人,但因为有后效性我们只能一个一个枚举.我们可以用一个fd数组标注这个点有没有被保护,当救下一个子树的人时我们把这个子树的数组都标记一下,回溯时再加回去就行.这样我们就可以非常,非常暴力的得到结果.

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int n,m,dis[N],x,y,ma;
bool vis[N],fd[N];
vector<int>f[N],v[N],tr[N];
struct node{
	int u,d;
	bool operator < (const node &u) const{
		return u.d<d;
	}
};
void remake(int x, int lev){
	tr[lev].push_back(x);
	for(int i=0;i<f[x].size();i++){
		int u=f[x][i];
		if(dis[u]==dis[x]+1){
			v[x].push_back(u);
			remake(u,lev+1);
		}
	}
}
void dij(){
	priority_queue<node>q;
	for(int i=2;i<=n;i++) dis[i]=(1e12);
	q.push({1,0});
	while(q.size()){
		node t=q.top();
		q.pop();
		if(vis[t.u]) continue;
		else vis[t.u]=1;
		for(int i=0;i<f[t.u].size();i++){
			int u=f[t.u][i];
			if(dis[t.u]+1<dis[u]){
				dis[u]=dis[t.u]+1, q.push({u,dis[u]});
			}
		}
	}
	remake(1,0);
}
int check(int x){
	fd[x]=1;
	int num=1;
	for(int i=0;i<v[x].size();i++){
		int u=v[x][i];
		num+=check(u);
	}return num;
}
void redo(int x){
	fd[x]=0;
	for(int i=0;i<v[x].size();i++){
		int u=v[x][i];
		redo(u);
	}
}
void dfs(int lev, int alive){
	ma=max(ma,alive);
	for(int i=0;i<tr[lev].size();i++){
		int u=tr[lev][i];
		if(!fd[u]){
			int num=check(u);
			alive+=num, dfs(lev+1,alive);
			redo(u), alive-=num;
		}
	}
}
signed main(){
	cin>>n>>m;
	while(m--){
		cin>>x>>y, f[x].emplace_back(y), f[y].emplace_back(x);
	}
	dij(), dfs(1,0), cout<<n-ma;
	return 0;
}
相关推荐
老鼠只爱大米19 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)19 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
一只小小的芙厨20 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解
我在人间贩卖青春20 小时前
C++之继承与派生类的关系
c++·向上造型·向下造型
Trouvaille ~20 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
_OP_CHEN20 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉821820 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER20 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
EmbedLinX20 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
xhbaitxl20 小时前
算法学习day38-动态规划
学习·算法·动态规划