当前位置: 首页 > news >正文

洛谷 P1330 封锁阳光大学

【题目链接】

洛谷 P1330 封锁阳光大学

【题目考点】

1. 图论:二分图判定

【解题思路】

放河蟹可以抽象为选择顶点。
“当两只河蟹封锁了相邻的两个点时,他们会发生冲突”,也就是说不能选择一条边连接的两个顶点。
河蟹准备封锁所有道路,也就是说每条边两端的顶点至少有一个是被选择的顶点。不存在某条边两端都是未选择顶点。
对于一个图的连通分量,所有选择的顶点构成一个集合,未选择的顶点构成一个集合。图中每条边都连接了一个已选择顶点和未选择顶点,显然该图是二分图。
对每个连通分量进行二分图染色,染色的同时统计每个颜色顶点集合的顶点数量。染色后得到两种颜色的顶点集合。由于要选择最少的顶点,那么看哪一个集合的顶点数量更少,就选择哪个集合中的所有顶点。
将每个连通分量中顶点数更少的集合的顶点数加和,即为该题结果。如果某个连通分量在进行二分图判定后发现并不是二分图,那么输出Impossible。

【题解代码】

解法1:二分图判定
  • 写法1:深搜二分染色
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n, m, color[N], ct[3], ans;//ct[1]、ct[2]颜色1的数量和颜色2的数量 
vector<int> edge[N];
bool dfs(int u)
{
	for(int v : edge[u])
	{
		if(color[v] == 0)
		{
			color[v] = 3-color[u];
			ct[color[v]]++;
			if(!dfs(v))
				return false;
		}
		else if(color[v] == color[u])
			return false;
	}
	return true;
} 
int main()
{
	int f, t;
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
		cin >> f >> t;
		edge[f].push_back(t);
		edge[t].push_back(f);
	}
	for(int i = 1; i <= n; ++i) if(color[i] == 0)
	{
		color[i] = 1;
		ct[1] = 1, ct[2] = 0;
		if(!dfs(i))
		{
			cout << "Impossible" << endl;
			return 0;
		}
		ans += min(ct[1], ct[2]);
	}
	cout << ans;
	return 0;
}
  • 写法2:广搜二分染色
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int n, m, color[N], ct[3], ans;//ct[1]、ct[2]颜色1的数量和颜色2的数量 
vector<int> edge[N];
bool bfs(int sv)
{
	queue<int> que;
	que.push(sv);
	while(!que.empty())
	{
		int u = que.front();
		que.pop();
		for(int v : edge[u])
		{
			if(color[v] == 0)
			{
				color[v] = 3-color[u];
				ct[color[v]]++;
				que.push(v); 
			}
			else if(color[v] == color[u])
				return false;
		}
	}
	return true;
}
int main()
{
	int f, t;
	cin >> n >> m;
	for(int i = 1; i <= m; ++i)
	{
		cin >> f >> t;
		edge[f].push_back(t);
		edge[t].push_back(f);
	}
	for(int i = 1; i <= n; ++i) if(color[i] == 0)
	{
		color[i] = 1;
		ct[1] = 1, ct[2] = 0;
		if(!bfs(i))
		{
			cout << "Impossible" << endl;
			return 0;
		}
		ans += min(ct[1], ct[2]);
	}
	cout << ans;
	return 0;
}

相关文章:

  • C++11:lambda表达式
  • 说一下java的探针agent的应用场景
  • 如何用开源工具,把“定制动漫面具”做成柔性制造?
  • Github最新AI工具汇总2025年4月份第2周
  • 【SPSS/EXCEl】主成分分析构建__综合评价指数
  • 遥感卫星概述#卫星工程系列
  • Linux基本操作指令5(查看IP)
  • 【合新通信】光纤延迟线(ODL)的原理
  • 一周学会Pandas2 Python数据处理与分析-NumPy算术运算和统计计算
  • qml信号与槽函数
  • 《命理学》专项探究与研习
  • css2学习总结之尚品汇静态页面
  • ragflow本地部署(WSL下Ubuntu)
  • Python Cookbook-5.7 在增加元素时保持序列的顺序
  • 人工智能通识速览(Part3. 强化学习)
  • OpenNMT 部署和集成指南
  • Dify 的介绍
  • Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(4)
  • C++动态内存管理完全指南:从基础到现代最佳实践
  • Windows系统本地化部署DeepSeek+Open-WebUi
  • 视频库网站建设/关键词挖掘工具免费
  • 企业网站建设套餐/最近营销热点
  • 住房和城乡建设部贰级建造师网站/网站设计公司有哪些
  • z怎么做优惠券网站/国家重大新闻
  • html5的网站设计/西安seo排名扣费
  • 建网站手机软件/百度seo优化技术