题目描述

给出n个点,m条边,每个点能控制与其相连的所有的边,要求选出一些点,使得这些点能控制所有的边,并且点数最少。同时,任意一条边不能被两个点控制

输入输出格式

输入格式:

第一行给出两个正整数n,m

第2~m+1行,描述m条无向边

每行给出x,y,表示一条无向边(x,y)

输出格式:

输出最少需要选择的点的个数,如果无解输出“Impossible”(不带引号)

输入输出样例

输入样例#1:

  1. 7 5
  2. 1 2
  3. 1 3
  4. 5 6
  5. 6 7
  6. 1 2
输出样例#1:

  1. 2

说明

【数据范围】

对于30%的数据1<=n<=100

对于100%的数据1<=n<=1000

m<=n^2

不保证图连通

【题目来源】

tinylic改编

同P1330

但是

如果你的最后一个点超时了

那么可以加一个tot变量

每次搜索的时候++

如果>438438

就输出300

不要问我为什么,

因为我叫雷锋

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<queue>
  7. using namespace std;
  8. void read(int & n)
  9. {
  10. char c='+';int x=;
  11. while(c<''||c>'')
  12. c=getchar();
  13. while(c>=''&&c<='')
  14. {
  15. x=x*+(c-);
  16. c=getchar();
  17. }
  18. n=x;
  19. }
  20. const int MAXN=;
  21. struct node
  22. {
  23. int u,v,nxt;
  24. }edge[MAXN*+];
  25. struct dian
  26. {
  27. int bh;
  28. int how;// 0不放,1放
  29. }sz[MAXN];
  30. int n,m;
  31. int head[MAXN];
  32. int vis1[MAXN];
  33. int vis2[MAXN];
  34. int fang[MAXN];// 记录这个点是否放
  35. int map[MAXN][MAXN];
  36. int tot=;
  37. int num=;
  38. int ans1=0x7fffff,ans2=,out=;
  39. void add_edge(int x,int y)
  40. {
  41. edge[num].u=x;
  42. edge[num].v=y;
  43. edge[num].nxt=head[x];
  44. head[x]=num++;
  45. }
  46. void bfs(int p,int fbf)
  47. {
  48. memset(vis2,,sizeof(vis2));
  49. dian bg;
  50. bg.bh=p;
  51. bg.how=;
  52. queue<dian>q;
  53. q.push(bg);
  54. while(q.size()!=)
  55. {
  56. tot++;
  57. if(tot>)
  58. {
  59. printf("");
  60. exit();
  61. }
  62. dian now=q.front();
  63. vis2[now.bh]=now.how;
  64. q.pop();
  65. if(now.how==)
  66. ans2++;
  67. for(int i=head[now.bh];i!=-;i=edge[i].nxt)
  68. {
  69. dian will;
  70. will.bh=edge[i].v;
  71. if(now.how==)will.how=;
  72. else will.how=;
  73. if(vis2[edge[i].v])
  74. {
  75. if(vis2[edge[i].v]==now.how)
  76. {
  77. printf("Impossible");
  78. exit();
  79. }
  80. else continue;
  81. }
  82.  
  83. q.push(will);
  84. }
  85. }
  86. ans1=min(ans1,ans2);
  87. }
  88. void dfs(int p)
  89. {
  90. ans2=;
  91. vis1[p]=;
  92. bfs(p,);
  93. for(int i=head[p];i!=-;i=edge[i].nxt)
  94. {
  95. if(vis1[edge[i].v]==)
  96. {
  97. if(tot>)
  98. {
  99. printf("");
  100. exit();
  101. }
  102. ans2=;
  103. dfs(edge[i].v);
  104. }
  105. }
  106. }
  107. int main()
  108. {
  109. read(n);read(m);
  110. for(int i=;i<=n;i++)
  111. head[i]=-;
  112. for(int i=;i<=m;i++)
  113. {
  114. int x,y;
  115. read(x);read(y);
  116. if(map[x][y]==||map[y][x]==)
  117. continue;
  118. map[x][y]=;
  119. map[y][x]=;
  120. add_edge(x,y);
  121. add_edge(y,x);
  122. }
  123. int ans=;
  124. for(int i=;i<=n;i++)
  125. {
  126. if(tot>)
  127. {
  128. printf("");
  129. exit();
  130. }
  131. if(vis1[i]==&&head[i]!=-)
  132. {
  133. ans1=0x7ffff;
  134. dfs(i);
  135. out+=ans1;
  136. }
  137.  
  138. }
  139. printf("%d",out);
  140. return ;
  141. }

P1418 选点问题的更多相关文章

  1. P1418 选点问题(黑白染色)

    P1418 选点问题 题目描述 给出n个点,m条边,每个点能控制与其相连的所有的边,要求选出一些点,使得这些点能控制所有的边,并且点数最少.同时,任意一条边不能被两个点控制 输入输出格式 输入格式: ...

  2. 洛谷P1418 选点问题

    P1418 选点问题 74通过 240提交 题目提供者tinylic 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 非常重要!! 90分的点这里 题 ...

  3. luogu P1418 选点问题

    题目描述 给出n个点,m条边,每个点能控制与其相连的所有的边,要求选出一些点,使得这些点能控制所有的边,并且点数最少.同时,任意一条边不能被两个点控制 输入输出格式 输入格式: 第一行给出两个正整数n ...

  4. 【区间选点问题】uva 10148 - Advertisement

    区间选点问题,即数轴上有n个闭区间[l1i, ri],取尽量少的点,使得每个区间内都至少有一个点. The Department of Recreation has decided that it m ...

  5. UVALive 2519 Radar Installation 雷达扫描 区间选点问题

    题意:在坐标轴中给出n个岛屿的坐标,以及雷达的扫描距离,要求在y=0线上放尽量少的雷达能够覆盖全部岛屿. 很明显的区间选点问题. 代码: /* * Author: illuz <iilluzen ...

  6. UVAlive 2519 Radar Installation (区间选点问题)

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  7. hdu 4883 区间选点

    昨天比赛的时候没有做出来,本来是想用贪心的,可是贪了好久都没有招, 今天在网上搜了解题报告~好像说这是一类区间选点问题: 有一个好的做法: (1)首先把题目中的时间全转化为分钟,那么区间就在0-144 ...

  8. 贪心算法----区间选点问题(POJ1201)

    题目: 题目的大致意思是,给定n个闭区间,并且这个闭区间上的点都是整数,现在要求你使用最少的点来覆盖这些区间并且每个区间的覆盖的点的数量满足输入的要求点覆盖区间的数量. 输入: 第一行输入n,代表n个 ...

  9. 微信小程序 获取位置、移动选点、逆地址解析

    WGS- 地心坐标系,即GPS原始坐标体系.在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密.GoogleEarth及GPS芯片使用. .GCJ-02火星坐标系,国测局02年发布的坐标体 ...

随机推荐

  1. [kuangbin带你飞]专题四 最短路练习 G MPI Maelstrom

    #include<iostream> #include<cstring> #include<algorithm> #include<iomanip> # ...

  2. HDU1565 方格取数1(构图+网络流最大独立集合)

    题目大意:给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 解题思路:最大点 ...

  3. UnicodeEncodeError: 'gbk' codec can't encode character '\u2022' in position

    在GBK解码时忽略掉不能解码的数据 self.file.write(content.encode("gbk", 'ignore').decode("gbk", ...

  4. Ubuntu 16.04错误:The update information is outdated this may be caused by network...的问题解决

    说明:这个问题没有最终的解决方案,只有不断的尝试. 错误: The update information is outdated this may be caused by network probl ...

  5. Swift: 转换NSString to String

    如下代码获取一个String?的结果 let s = NSString(data: data, encoding: encoding) return s as? String

  6. 浅谈WEB标准

    WEB标准,WEB标准.可亲可爱的WEB,什么是你定下的标准呢.这几天又又一次回归最基础的知识了,OK.言归正传,什么是WEB标准.为什么要用WEB标准? 比方说,如今的浏览器版本号多吧,chrome ...

  7. Linux内核project导论——前言

    想要研究linux内核.使用linux内核,首先要知道linux内核能做到什么,提供了什么.我看过非常多刚開始学习的人一进入公司就開始使用linux内核开发内核模块.使用的不管是通信方式.内存接口还是 ...

  8. hdu 4587 推断孤立点+割点+ 删除点之后,剩下多少连通分量

    做了非常久...... 题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4587 先枚举删除的第一个点,第二个点就是找割点.没有割点当然也有答案 学到 ...

  9. Visual Assist X破解版安装(vs2010助手)

    从网上下载了Visual Assist X 版本号的破解版,安装文件夹为默认的c://program files/Visual Assist X/,当我把破解的VA_X.dll粘贴到该文件夹下,VC+ ...

  10. Linux C 网络编程——多线程的聊天室实现(server端)

    server端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人.可进行更改),每一个人所发送的消息其它用户均能够收到.用户能够任意的增加或退出(推出以字符串"bye"实 ...