洛谷 P1330 封锁阳光大学题解

题目描述

曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。

阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。

询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。

输入格式

第一行:两个整数N,M

接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。

输出格式

仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。

输入输出样例

输入 #1复制
3 3
1 2
1 3
2 3
输出 #1复制
Impossible
输入 #2复制
3 2
1 2
2 3
输出 #2复制
1

说明/提示

【数据规模】

1<=N<=10000,1<=M<=100000,任意两点之间最多有一条道路。


题解

本题实际上是一道二分图的题目。

如果我们把图中U、V两个集合中的所有连线都用河蟹断开,就达到了题目要求。要判断图中的二分图,只需要类似01迷宫进行BFS遍历染色即可。在染色的过程中,如果发现连线的另一个端点未染色,就用和当前端点不同的颜色染色,要是已经染色且和当前节点颜色相同,就说明构成循环圈,不能构成二分图,类似下图的情况。

代码如下:

  1 #include <iostream>
  2 #include <math.h>
  3 #include <stdio.h>
  4 #include <algorithm>
  5 #include <string.h>
  6 
  7 using namespace std;
  8 
  9 const int MAXN = 100005;
 10 int first[MAXN], n, m, en, color[MAXN], f[2], u, v; //f统计不同颜色节点数 
 11 int front, rear; 
 12 bool vis[MAXN]; 
 13 int ans;
 14 
 15 struct edge
 16 {
 17     int zhongdian, changdu;
 18     int next;
 19 };
 20 
 21 edge ed[MAXN]; 
 22 
 23 void add_edge(int s, int e, int d) 
 24 {
 25     en++; 
 26     ed[en].next = first[s]; 
 27     first[s] = en;
 28     ed[en].zhongdian = e;
 29     ed[en].changdu = d;
 30 }
 31 
 32 struct Node
 33 {
 34     int x, y;
 35     int step;
 36 };
 37 Node q[MAXN];
 38 
 39 int bfs(int a)
 40 {
 41     Node now, next;
 42     now.x = a;
 43     vis[a] = 1;
 44     color[a] = 1;
 45     f[0] = 0;
 46     f[1] = 1;
 47     front = rear = 0;
 48     q[rear] = now;
 49     rear++;
 50     while(front < rear)
 51     {
 52         now = q[front++];
 53         for(int i = first[now.x]; i; i = ed[i].next)
 54         //first[now]:当前点的第一条边;ed[i].next:下一个访问的点  
 55         {
 56             if(color[ed[i].zhongdian] != -1)
 57             {
 58                 if(color[ed[i].zhongdian] == color[now.x])
 59                 {
 60                     cout << "Impossible" << endl;
 61                     return -1;
 62                 }
 63             } 
 64             else
 65             {
 66                 color[ed[i].zhongdian] = (color[now.x] + 1) % 2;
 67                 q[rear].x = ed[i].zhongdian;
 68                 rear++;
 69                 f[color[ed[i].zhongdian]]++;
 70             }
 71         } 
 72     }
 73     ans += min(f[0], f[1]);
 74 }
 75 
 76 int main()
 77 {
 78     cin >> n >> m;
 79     for(int i = 1; i <= n; i++)
 80     {
 81         color[i] = -1; //初始化  
 82     }
 83     for(int i = 1; i <= m; i++)
 84     {
 85         cin >> u >> v;
 86         add_edge(u, v, 0);
 87         add_edge(v, u, 0);
 88     }
 89     for(int i = 1; i <= n; i++)
 90     {
 91         if(color[i] == -1)
 92         {
 93             if(bfs(i) < 0)
 94             {
 95                 return 0;
 96             }
 97         } 
 98     }
 99     cout << ans << endl;
100     
101     return 0;
102 }

代码中的f数组是用来统计黑白两种染色点的个数的,本题所求的最小河蟹数就是两种染色点个数的最小值。

 

转载于:https://www.cnblogs.com/zealsoft/p/11399061.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的for i in range(range()函数的for循环)如何使用,详细介绍

range函数的for循环1.定义2.两种形式3.可理解性例子4.range函数的特性详述4.1 左闭右开4.2 开始值默认为04.3 步长值默认为14.4 range函数的反向输出5.与列表list的使用6.range与list的区别1.定义 range是一个函数&#xff0c;它返回的是一个可迭代对象&#xff0c;大多使用于…

洛谷 P1162 填涂颜色题解

题目描述 由数字00组成的方阵中&#xff0c;有一任意形状闭合圈&#xff0c;闭合圈由数字11构成&#xff0c;围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如&#xff1a;6 \times 666的方阵&#xff08;n6n6&#xff09;&#xff0c;涂色前和涂色后的…

SyntaxError: invalid syntax-python报错

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xf…

洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解

题意翻译 题目描述 每年&#xff0c;在威斯康星州&#xff0c;奶牛们都会穿上衣服&#xff0c;收集农夫约翰在N(1<N<100&#xff0c;000)个牛棚隔间中留下的糖果&#xff0c;以此来庆祝美国秋天的万圣节。 由于牛棚不太大&#xff0c;FJ通过指定奶牛必须遵循的穿越路线来…

TypeError: can‘t send non-None value to a just-started generator-python报错问题

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; TypeError: can’t send non-None value to a just-starte…

Redux概览

简介 Redux 是一个有用的架构Redux 的适用场景&#xff1a;多交互、多数据源工作流程图 action 用户请求 //发出一个action import { createStore } from redux; const store createStore(fn);//其中的type属性是必须的&#xff0c;表示 Action 的名称。其他属性可以自由设置 …

详解python中的yield(生成器)

yield1.yield与return的异同点2.yield使用的好处3.具体实例理解生成器的用法实例一实例二实例三1.yield与return的异同点 相同&#xff1a;都可以返回函数执行的结果 不同点&#xff1a; return是用来返回具体的某个值。 yield一般与循环一起用&#xff0c;被称之生成器&…

洛谷 P1219 八皇后题解

题目描述 检查一个如下的6 x 6的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得每行、每列有且只有一个&#xff0c;每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2 4 6 1 3 5来描述&#xff0c;第i个数字表示在第i行的相…

Python猜字游戏(用函数)(最新版)

#codingutf-8#猜字游戏#导入随机数 import random#判断数的大小与答案的大小 def guess_judge(num):while (True):guess_judge_num get_input_num()if (guess_judge_num num):print("太棒了&#xff0c;答对了")breakelif (guess_judge_num > num):print("…

java文件名判断练习

public class HelloWorld { public static void main(String[] args) { // Java文件名 String fileName "HelloWorld.java"; // 邮箱 String email "laurenyangimooc.com"; // 判断.java文件名是否正确&#xff1a;合法的文件名应该以.java结尾 /* 参考…

node中间件KOA函数

const Koa require(koa);const app new Koa()//应用程序对象 中间件// 发送HTTP KOA 接手HTTP//中间件(其实就是 函数)function test(){console.log("seven month");}//当请求发送过来的时候&#xff0c;将函数&#xff08;中间件&#xff09;注册到程序上//前端发…

python不定长参数详解

不定长参数1.不定长参数两种基本形式&#xff1a;2.实例2.1实例一2.2实例二2.3实例三2.4实例四2.5实例五https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff0…

TypeError: missing 1 required keyword-only argument-python中的报错问题

如下图所示&#xff0c;报错为TypeError: JayChou() missing 1 required keyword-only argument: ‘c’ 翻译过来是&#xff1a;TypeError:JayChou&#xff08;&#xff09;缺少1个仅限关键字的参数&#xff1a;“c” 报错代码&#xff1a; #codingutf-8def JayChou(a, *b, …

brython的问题

brython 挺不错&#xff0c;但有bug。 再brython中使用mpmath做精确计算。 发现&#xff1a; int((10365497382627524465995480721708502202835782160567615922664140839297673785867108053215069740783364534873417778099632142363871844991858866483475618976713337522230394…

xshell下载及连接Linux

xshell的下载及连接Linux一、下载二、连接Linux一、下载 网址&#xff1a;https://www.netsarang.com/zh/xshell/ 1进入主页后下滑点击下载 2.不要去安装盗版&#xff0c;会出现一些问题。选择家庭版即可&#xff0c;点击免费授权页面 3.填上你的姓名和邮件&#xff0c;再勾…

PageHelper只对紧跟着的第一条SQL起作用

这个sql的中心思想就是根据查询到的schema然后分别查询schema中的相关数据再用union all将结果及拼接在一起。LocServiceImpl.findAllLoc(Loc loc) Overridepublic List<Loc> findAllLoc(Loc loc) {try {HashMap<String,Object> map new HashMap<String,Object…

xshell更改背景颜色,解决乱码问题及更改字体及字体大小

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 这三个键分别是更改背景颜色&#xff0c;解决乱码问题&…

PL/SQL Developer的错误提示弹框的文本显示乱码问题

问题&#xff1a;Windows中文环境下&#xff0c;PL/SQL Developer的错误提示弹框文本为乱码&#xff0c;如下&#xff1a; 解决过程&#xff1a;1.使用SELECT * FROM v$nls_parameters;查询得知服务器的字符集编码为&#xff1a;  NLS_LANGUAGESIMPLIFIED CHINESE  NLS_CHA…

xftp连接linux及xftp下载安装

xftp一、下载二、安装三、Xftp连接linux一、下载 网址&#xff1a;https://www.netsarang.com/zh/xftp/ 1.打开这个网址后&#xff0c;点击下图的下载 2.不要去下载盗版&#xff0c;我们可以下载官网的免费版&#xff0c;点击家庭版的免费授权页面 3.接下来再填写你的姓名和…

洛谷 P2722 总分题解

题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并…