题目传送门

这道题我们很容易去想到二分图染色,但是这个题好像又不是一个严格的二分图。

开始的思路:dfs每个点,扫与他相邻的每个点,如果没访问,染相反颜色;如果访问过,进行检查,如果不可行,直接结束程序。每dfs一次,计数器加1.--40pts

然鹅这个思路存在(很明显的)漏洞:我们统计的是默认初始颜色所染的个数,但是题目中求的是最小的河蟹放置个数,很有可能相反颜色放的更少。--100pts

另外在题解中经某位高人指点,终于懂得

1 for(int i=1;i<=n;i++)
2     if(!vis[i]) dfs(i)

这种语句的真正含义!其实在1~n的循环中,实际从主程序中调用了几次Dfs函数,就有几个联通块。(很多情况下图不保证联通)因为我们回想大法师的真正含义,他是不撞南墙不回头(回溯)的。除非没有新的南墙可撞。

然后我们就愉快的AC了。

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3
 4 using namespace std;
 5
 6 int n,m,a,b,ans,tot;
 7 int head[10090],vis[10090],sum[5],color[10090];
 8 struct node{
 9     int to,next;
10 }edge[200090];
11
12 void add(int x,int y)
13 {
14     edge[++tot].to=y;
15     edge[tot].next=head[x];
16     head[x]=tot;
17 }
18
19 void dfs(int u,int pts)
20 {
21     vis[u]=1;color[u]=pts;sum[pts]++;
22     for(int i=head[u];i;i=edge[i].next)
23     {
24         int y=edge[i].to;
25         if(vis[y])
26         {
27             if(color[y]!=3-pts)
28             {
29                 printf("Impossible");
30                 exit(0);
31             }
32         }
33         else dfs(y,3-pts);
34     }
35 }
36
37 int main()
38 {
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=m;i++)
41         scanf("%d%d",&a,&b),add(a,b),add(b,a);
42     for(int i=1;i<=n;i++)
43     {
44         sum[1]=0,sum[2]=0;
45         //实质在扫联通块
46         if(!vis[i]) dfs(i,1),ans+=min(sum[1],sum[2]);
47     }
48     printf("%d",ans);
49     return 0;
50 }

View Code

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9504885.html

Luogu P1330 封锁阳光大学【Dfs】 By cellur925相关推荐

  1. luogu P1330 封锁阳光大学

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

  2. P1330 封锁阳光大学

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

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

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

  4. 洛谷P1330 封锁阳光大学

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

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

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

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

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

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

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

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

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

  9. 【并查集】封锁阳光大学(P1330)

    正题 P1330 题目大意 给你一张无向图,问你最少选择多少个点,使得每一条边都有且只有一个端点被选择 解题思路 每一条边只能选一个点,那么考虑对这个图黑白染色 可以用扩展域并查集判二分图,然后两边的 ...

最新文章

  1. 阿里机器学习算法面经(已offer)
  2. Java联网技术之一HTTP
  3. 趣学python3(26)-pygame-蛇身运动
  4. php 怎么写原生sql,thinkphp 原生sql 怎么写?
  5. python绘制混淆矩阵_如何实现python绘制混淆矩阵?
  6. linux内核rest_init分析
  7. WebSocket剖析
  8. 人民大学的《统计学》
  9. 《OSPF网络设计解决方案(第2版)》一第2章 介绍OSPF
  10. ubuntu简易部署Python3编写的djangoWeb应用
  11. 华为怒发公开信;锤子手机难产罗永浩陷尴尬处境;苹果错失 5G | 极客头条
  12. Unity app调试
  13. 计算机科学导论复习提纲,计算机科学导论复习资料整理
  14. 基于微信旅游景区购票小程序毕业设计毕设作品(5)开题报告答辩PPT
  15. Java开发手册!java项目描述模板,挥泪整理面经
  16. AT学习报告一 软件的初步使用
  17. 荷池堪作镜,盈盈可鉴心。(递推
  18. pta 天梯赛 7-3 换硬币 (20 分)day4
  19. 计算机网络(IP/TCP网络分层)
  20. html骂人网页,网页前台通过js非法字符过滤代码(骂人的话等等)

热门文章

  1. oracle 怎么创建sid,oracle创建实例SID
  2. 灵敏度分析领域--多种编程语言工具箱总结
  3. python3蓝牙通讯_使用Python 3.3的蓝牙服务器
  4. 无界共创,明道云参与广汽本田IT新技术展
  5. [分享] jQuery开发之windows边栏小工具开发(Gadget development)- windows小工具实现的公司内部分机查询工具...
  6. 沧州市中考计算机操作试题,2018沧州市中考数学模拟试题【精编版含答案】
  7. MVC3学习第十五章 武林外传大结局
  8. java ATM查看余额_Java测试总结(ATM)
  9. CreateMutex用法详解
  10. ubuntu:窗口/终端最大化或者全屏快捷键设置