P1330 封锁阳光大学

题目描述

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

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

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

输入格式

第一行两个正整数,表示节点数和边数。 接下来 \(m\) 行,每行两个整数 \(u\)、\(v\) ,表示点 \(u\) 到点 \(v\) 之间有道路相连。

输出格式

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

输入输出样例

输入 #1

3 3
1 2
1 3
2 3

输出 #1

Impossible

输入 #2

3 2
1 2
2 3

输出 #2

1

说明/提示

【数据规模】

对于所有的数据,\(1\leq n\leq 10^4\),\(1\leq m\leq 10^5\),保证没有重边。

思路

想要把所有的道路封住,将设断点(放河蟹的点),不妨把断开的点设为黑点,不断开的为白点,在数组中就可以设黑点为 \(1\) ,白点为 \(0\) 。

枚举 \(1-n\) 的点,依次染色,染黑白都无所谓,既可以断黑点不断白点,又可以断白点不断黑点,都可以使街道全部封闭(可以自己模拟一个简单的样例),所以到最后取最小值便可。

但如果染色过程中,出现冲突,即刻弹出,输出 \(Impossible\) 。

代码

#include <bits/stdc++.h>
using namespace std; const int maxn=10000+50;
int n,m;
int tot;
int head[maxn];
int vis[maxn];
int col[maxn];//i点被染成的颜色
int ans1;//被染为黑点的个数
int ans0;//被染为白点的个数
int ans; struct Edge{
int next,to;
}e[maxn];
void Add(int u,int v){//前向星加边
e[++tot].to=v;
e[tot].next=head[u];
head[u]=tot;
}
bool dfs(int u,int color){//将u点染为color
if(vis[u]){//如果被访问过
if(col[u]==color){//且之前染的颜色与现在要染的颜色相同,合法
return true;
}else{//若不同,不合法
return false;
}
}
vis[u]=1;//设为已被访问
col[u]=color;//染色
if(color==1)ans1++;//记录被染为黑点的个数
else ans0++;//记录被染为白点的个数
bool en=true;
for(int i=head[u];i&&en;i=e[i].next){
int v=e[i].to;
en=en&&dfs(v,1-color);//若v点不能被染为(1-color),则不合法
}
return en;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
Add(u,v);//无向图
Add(v,u);
}
for(int i=1;i<=n;i++){
if(vis[i])continue;//若已被访问过,跳过
ans0=0;
ans1=0;
if(!dfs(i,0)){//将i点染为白色,但无法合法地染色
printf("Impossible\n");
return 0;
}
ans+=min(ans0,ans1);//白点、黑点相互转换
}
printf("%d\n",ans);
return 0;
}

P1330 封锁阳光大学——深度优先搜索DFS的更多相关文章

  1. P1330 封锁阳光大学(染色问题)

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

  2. 洛谷——P1330 封锁阳光大学

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

  3. 洛谷P1330 封锁阳光大学(二分图染色)

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

  4. luogu P1330 封锁阳光大学 x

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

  5. 二分图染色模板(P1330 封锁阳光大学)

    二分图染色模板(P1330 封锁阳光大学) 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校 ...

  6. P1330 封锁阳光大学[搜索+染色]

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

  7. P1330 封锁阳光大学 DFS

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

  8. 洛谷P1330 封锁阳光大学

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

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

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

随机推荐

  1. FT-8900, 8800,7800 , FT-897, 857 e 817 连接中继板接线图

    FT-8900, 8800,7800 , FT-897, 857 e 817 等 车台支持Moto GM950i GM300(只适合接收) GM3688等

  2. cuda基础

    一:cuda编程模型 1:主机与设备 主机---CPU 设备/处理器---GPU CUDA编程模型如下: GPU多层存储空间结构如图: 2:Kernel函数的定义与调用 A:运行在GPU上,必须通过_ ...

  3. 百度poi搜索

    package baidumapsdk.demo.search; import android.os.Bundle; import android.support.v4.app.FragmentAct ...

  4. JavaScript的for循环

    1.循环的目的 什么是循环?循环的目的是什么?循环能做什么? 举一个小例子:武汉疫情,学了JavaScript,必须拿JavaScript干点有意义的事情.我们想告诉武汉:“武汉加油,武汉挺住啊!”. ...

  5. vue无法选择上传相同文件

    使用h5自带的input type=file时,使用change触发上传事件 <input class="exportss" type="file" id ...

  6. 通过Nginx、Consul、Upsync实现动态负载均衡和服务平滑发布

    前提 前段时间顺利地把整个服务集群和中间件全部从UCloud迁移到阿里云,笔者担任了架构和半个运维的角色.这里详细记录一下通过Nginx.Consul.Upsync实现动态负载均衡和服务平滑发布的核心 ...

  7. Linux防火墙iptables详解

    iptables详解(思维导图) 1. 概述 1.1 iptable简介 1.2 防火墙的种类 1.3 netfilter 2. iptables的工作流程 2.1 iptables工作图示 2.2 ...

  8. (六)maven 聚合和继承

    项目目录 my_test 聚合pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  9. map处理:map(str,[1,2,3,4,5,6])

    #map(s1,s2)传入两个参数,s1是对该Iterable每个参数做处理的参数,s2是该Iterable print(list(map(str,[1,2,3,4,5,6]))) #map()传入的 ...

  10. PowerBuilder中调用NPOI进行Excel导出格式设置示例

    // 功能 :新建excel带边框的单元格,格式为数字并显示为美元货币 // 参数 :ai_row,行号:ai_col,列号 // 返回值 :true/false // 作者 :潮崖之飔 // 日期 ...