题目描述
曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。
阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。
询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。

输入输出格式
输入格式:
第一行:两个整数N,M
接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。

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

输入输出样例
输入样例#1:
【输入样例1】
3 3
1 2
1 3
2 3

【输入样例2】
3 2
1 2
2 3

【输出样例1】
Impossible

【输出样例2】
1

题解:这题就是让你给一张图染色,要求相邻点的颜色不能相同,如果相同,就输出Impossible。否则取两种颜色中较少的就是最优染色,注意图不一定都连通,所以如果还有没染色的点就继续染色,把所有图中的最优染色加起来就是答案

代码如下

#include<queue>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXV=10000+500;
const int MAXE=100000+500;
int first[MAXV],nxt[MAXE<<1],use[MAXV];
int m,n,tot=0,ans=0;
bool vis[MAXV];
struct edge
{int from,to,cost;
}es[MAXE<<1];
void build(int f,int t)
{es[++tot].from=f;es[tot].to=t;nxt[tot]=first[f];first[f]=tot;
}
queue<int> Q;
int bfs(int s)
{int ans1=0,ans2=0;Q.push(s);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=first[u];i;i=nxt[i]){int v=es[i].to;if(!use[v])//给相邻的点染上不同的颜色 {use[v]=use[u]==1?2:1;Q.push(v);}else if(use[v]==use[u])//如果发现冲突,输出Impossible{printf("Impossible\n");exit(0);//退出程序 }}}for(int i=1;i<=n;i++){if(use[i]==1&&!vis[i]){ans1++;vis[i]=1;}else if(use[i]==2&&!vis[i]){ans2++;vis[i]=1;}}return min(ans1,ans2);//颜色少的为最佳答案
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int ff,tt;scanf("%d%d",&ff,&tt);build(ff,tt);build(tt,ff);}for(int i=1;i<=n;i++){if(!use[i])//可能存在不连通的多个图 {use[i]=2;ans+=bfs(i);}}printf("%d\n",ans);return 0;
}

洛谷 P1330 封锁阳光大学(BFS染色)相关推荐

  1. 洛谷 P1330 封锁阳光大学 二分图染色

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  2. 洛谷 P1330 封锁阳光大学 Label:染色问题

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  3. 洛谷P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  4. 洛谷 P1330 封锁阳光大学题解

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  5. 【C++】洛谷P1330 封锁阳光大学

    封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由 nnn 个点构成的 ...

  6. 洛谷P1330封锁阳关大学口胡实况

    原题目见洛谷(https://www.luogu.org/problemnew/show/P1330) 这道题如果仔细想想的话其实河蟹的分布就是对这张图进行黑白染色,且相邻的两点要染成不同的颜色,如果 ...

  7. P1330 封锁阳光大学

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  8. luogu P1330 封锁阳光大学

    嘟嘟嘟 又刷了一道水题-- 很显然只要判断这个图是否是二分图就行了,判断方法就是染色.如果对于边(u->v),两个点颜色相同,那么就说明图中存在奇环,不是二分图. 统计答案的时候输出两种颜色较小 ...

  9. Luogu P1330 封锁阳光大学【Dfs】 By cellur925

    题目传送门 这道题我们很容易去想到二分图染色,但是这个题好像又不是一个严格的二分图. 开始的思路:dfs每个点,扫与他相邻的每个点,如果没访问,染相反颜色:如果访问过,进行检查,如果不可行,直接结束程 ...

  10. 黑白染色——封锁阳光大学

    所谓黑白染色,就是指用bfs或dfs依次遍历每一个点,同时进行染色,一黑一白,如果遇到已经染过色的点并且点的颜色和即将要染的颜色冲突,就说明无法进行二分,无法满足染色.大概就是这样的. 下面我们看一道 ...

最新文章

  1. 自定义notebook扩展插件_Jupyter notebook安装扩展插件
  2. python递归函数是指_python 函数递归作业求解析
  3. svm 程序matlab,求svm的matlab程序
  4. WPF and Silverlight 学习笔记(九):WPF布局管理之Canvas、InkCanvas
  5. 数据结构:后缀表达式(逆波兰表达式)
  6. [一维粒子模拟 version3.6]renormalization
  7. ArcGIS中生成蜂窝多边形算法解析
  8. mysql加入新的从节点怎么配置,Mysql 5.7从节点配置多线程主从复制的方法详解
  9. Android基础之图片的压缩算法
  10. Matlab linspace函数C++实现
  11. 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
  12. 百度网盘分享旁边的个人说明如何修改
  13. unity学习、unity培训、unity企业培训、U3D资源、U3D培训视频U3D教程、U3D常见问题、U3D项目源码
  14. 以txt为数据源的随机点名系统
  15. 231313132131
  16. 跟风 —— 由技术跟风所想到的
  17. uniapp运行基座到电视机调试
  18. 柔性印刷电路板(PCB)的设计方法、类型等详细解析
  19. Spring JPA整合QueryDSL
  20. 腾讯王巨宏:拥抱开源是这个时代开发者应该具备的思维和能力

热门文章

  1. 数学之美系列好文,强推
  2. JavaScript数据源版省市县三级联动
  3. 联想电脑如何关闭/开启windows自动更新
  4. [opencv4]——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
  5. html5家谱制作模板,Word如何做家谱世系图?
  6. CS5211中文规格书
  7. 【数据分析】销售案例分析——分解目标
  8. excel多表格整合去重与空格去除
  9. WDS桥接和WDS中继的区别
  10. 9、IPA通路分析相关网页教程