【u005】封锁阳光大学
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。
【输入格式】
第一行:两个整数N,M 接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。
【输出格式】
如果不能够对大学进封锁,则输出Impossible,否则输出所需要的最小河蟹数目。
【数据规模】
1<=N<=10000,1<=M<=100000,任意两点之间最多有一条道路。
Sample Input1
3 3
1 2
1 3
2 3
Sample Output1
Impossible
Sample Input2
3 2
1 2
2 3
Sample Output2
1
【题解】
简单的方法是对所有点进行染色。
如上图。在相同的颜色处放河蟹。即可占据所有的道路。且不会发生冲突。即相邻点染成不同的颜色。
然后要求最小。就要看在0处放河蟹放得比较少还是在1处会放得比较少。取其中的较小值即可。
然后可能会有多个子图的情况。注意一下即可。
染色可以用广搜进行。顺便可以判断会不会出现impossible的情况。
【代码】
#include <cstdio>
#include <cstring>
#include <stdlib.h>
struct node//很久没打链表了。练一下。
{
int en;
node *next;
};
int n, m,color[10001],dl[10001],final_ans = 0;//color[]是给每个点染的颜色。
node *head[10001],*tail[10001];//表示邻接表的头结点和尾节点。
bool bo[10001] = { 0 };//判断某个点是否染色过。
void input_data();
void add(int,int);
void get_ans();
int bfs(int);
void output_ans();
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
input_data();
get_ans();
output_ans();
return 0;
}
void output_ans()//输出最后的答案。
{
printf("%d", final_ans);
}
int bfs(int key)//从key点开始广搜进行染色。
{
bo[key] = true;
color[key] = 0;
int h = 0, t = 1;
dl[1] = key;//加入队列
while (h != t)
{
h++;//取出头结点
int x = dl[h];
node *temp = head[x]->next;//寻找其出度。是双向边。
while (temp != NULL)
{
int y = temp->en;
if (!bo[y])//如果之前没有染色过
{
color[y] = 1 - color[x];//给其染上和x不同的颜色
bo[y] = true;//标记它已经染色过
t++;//然后把它加入到队列中,一是为了继续染色。而是为了判断它和它的邻点是否冲突。
dl[t] = y;
}
else
if (color[y] == color[x])//如果出度已经染过色且颜色发生冲突。则输出不可能
{
printf("Impossible");
exit(0);//直接结束所有的程序。
}
temp = temp->next;//寻找下一个出度。
}
}
int ans[2];//算出把河蟹放在颜色0和颜色1分别所需要的数目
ans[0] = 0; ans[1] = 0;
for (int i = 1; i <= t; i++)
ans[color[dl[i]]]++;
if (ans[0] > ans[1])//返回其中的较小值 bfs是一个返回Int的函数。
return ans[1];
else
return ans[0];
}
void get_ans()
{
for (int i = 1; i <= n; i++)
if (!bo[i])//因为可能出现多个子图,所以可能要多次染色。
final_ans+=bfs(i);
}
void add(int x, int y)//加入一条边,从x->y,然后执行add(x,y),add(y,x)就变成无向边了。
{
tail[x]->next = new node;
tail[x] = tail[x]->next;
tail[x]->next = NULL;
tail[x]->en = y;
}
void input_data()
{
scanf("%d%d", &n, &m);//输入n和m
for (int i = 1; i <= n; i++)//初始化邻接表
{
head[i] = new node;
head[i]->next = NULL;
tail[i] = head[i];
}
for (int i = 1; i <= m; i++)//输入图的信息。
{
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
}
【u005】封锁阳光大学的更多相关文章
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷 P1330 封锁阳光大学 Label:染色问题
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- Codevs 1535 封锁阳光大学
1535 封锁阳光大学 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大 ...
- P1330 封锁阳光大学 DFS
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷——P1330 封锁阳光大学
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷P1330 封锁阳光大学 [图论,染色]
题目传送门 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- P1330 封锁阳光大学(染色问题)
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- P1330 封锁阳光大学(二分图染色)
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
随机推荐
- BZOJ1195: [HNOI2006]最短母串(Trie图,搜索)
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...
- 计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)
实验课安排 地点: 科技楼423 时间: 计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家 ...
- 怎样 TabHostFragment自己定义 tab键(indicator)
1 获得 tabHostFragment: ActionBarActivity activity2 = (ActionBarActivity) activity; mTabHost = new Fra ...
- ToggleButton控件
ToggleButton 两种状态 ·状态button -继承自CompoundButton ·主要属性:-Android:textOn -Android:textOff ·主要方法: ...
- 原生js大总结九
81.ES6的Symbol的作用是什么? ES6引入了一种新的原始数据类型Symbol,表示独一无二的值 82.ES6中字符串和数组新增了那些方法 字符串 1.字符串模板 ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛 && hdu 6154】CaoHaha's staff
[链接]点击打开链接 [题意] 给你一个面积,让你求围成这个面积最少需要几条边,其中边的连线只能是在坐标轴上边长为1的的线或者是两个边长为1 的线的对角线. [题解] 找规律题 考虑s[i]表示i条边 ...
- HDU1969 Pie(二分搜索)
题目大意是要办生日Party,有n个馅饼,有f个朋友.接下来是n个馅饼的半径.然后是分馅饼了, 注意咯自己也要,大家都要一样大,形状没什么要求,但都要是一整块的那种,也就是说不能从两个饼中 各割一小块 ...
- 关于在IISserver上执行asp.net Web程序出现以下 “Could not load file or assembly。。。”问题的
Could not load file or assembly 'System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, Public ...
- Java核心技术 卷Ⅰ 基础知识(4)
第六章 接口与内部类 接口 特性 接口与抽象类 对象克隆 接口与回调 内部类 使用内部类访问对象状态 内部类的特殊语法规则 局部内部类 匿名内部类 静态内部类 代理 Class[] in=new Cl ...
- POJ 3264 Balanced Lineup 线段树RMQ
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...