题意:给定一个无向图,让你把所有点的和它的任意一个相邻点匹配起来,问你是方案是不是唯一,如果是,则输出方案。

析:贪心,很容易知道,如果一个点的度数是 1,那么它只有一个相邻点,这样的话,我们就可以把它和它相邻结点匹配,然后把与它相邻结点也相邻的点的度数都减 1,然后再找度数为 1 的点,直接找不到为止,如果最后所得到的匹配数是 n / 2 个,那么方案就是唯一,否则不是无解,就是多种方案。

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <sstream>
  17. #include <list>
  18. #include <assert.h>
  19. #include <bitset>
  20. #include <numeric>
  21. #define debug() puts("++++")
  22. #define gcd(a, b) __gcd(a, b)
  23. #define lson l,m,rt<<1
  24. #define rson m+1,r,rt<<1|1
  25. #define fi first
  26. #define se second
  27. #define pb push_back
  28. #define sqr(x) ((x)*(x))
  29. #define ms(a,b) memset(a, b, sizeof a)
  30. #define sz size()
  31. #define be begin()
  32. #define ed end()
  33. #define pu push_up
  34. #define pd push_down
  35. #define cl clear()
  36. #define lowbit(x) -x&x
  37. //#define all 1,n,1
  38. #define FOR(i,n,x) for(int i = (x); i < (n); ++i)
  39. #define freopenr freopen("in.in", "r", stdin)
  40. #define freopenw freopen("out.out", "w", stdout)
  41. using namespace std;
  42.  
  43. typedef long long LL;
  44. typedef unsigned long long ULL;
  45. typedef pair<int, int> P;
  46. const int INF = 0x3f3f3f3f;
  47. const LL LNF = 1e17;
  48. const double inf = 1e20;
  49. const double PI = acos(-1.0);
  50. const double eps = 1e-10;
  51. const int maxn = 1000 + 5;
  52. const int maxm = 700 + 10;
  53. const LL mod = 1000000007;
  54. const int dr[] = {-1, 1, 0, 0, 1, 1, -1, -1};
  55. const int dc[] = {0, 0, 1, -1, 1, -1, 1, -1};
  56. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  57. int n, m;
  58. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  59. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  60. inline bool is_in(int r, int c) {
  61. return r >= 0 && r < n && c >= 0 && c < m;
  62. }
  63. inline int readInt(){ int x; scanf("%d", &x); return x; }
  64.  
  65. vector<int> G[maxn];
  66. int in[maxn];
  67. vector<P> ans;
  68. bool vis[maxn];
  69.  
  70. int main(){
  71. int T; cin >> T;
  72. while(T--){
  73. scanf("%d %d", &n, &m);
  74. for(int i = 1; i <= n; ++i) G[i].cl;
  75. ms(in, 0);
  76. for(int i = 0; i < m; ++i){
  77. int a, b; scanf("%d %d", &a, &b);
  78. G[a].pb(b); G[b].pb(a); ++in[a]; ++in[b];
  79. }
  80. ans.cl; ms(vis, 0);
  81. while(ans.sz != n / 2){
  82. bool ok = false;
  83. for(int i = 1; i <= n; ++i) if(!vis[i] && in[i] == 1){
  84. ok = true; vis[i] = 1;
  85. --in[i];
  86. for(int j = 0; j < G[i].sz; ++j){
  87. int v = G[i][j];
  88. if(!vis[v]){
  89. ans.pb(P(min(i, v), max(i, v)));
  90. vis[v] = 1;
  91. for(int k = 0; k < G[v].sz; ++k) --in[G[v][k]];
  92. break;
  93. }
  94. }
  95. }
  96. if(!ok) break;
  97. }
  98. if(ans.sz != n/2) puts("NO");
  99. else{
  100. puts("YES");
  101. sort(ans.be, ans.ed);
  102. for(auto &it : ans) printf("%d %d\n", it.fi, it.se);
  103. }
  104. }
  105. return 0;
  106. }

  

  

UVaLive 4628 Jack's socks (贪心)的更多相关文章

  1. UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)

    题意:给定 n 个区间,让你选出最多的区间,使得每个区间不相交. 析:贪心题,贪心策略是按右端点排序,然后按着选即可. 代码如下: #pragma comment(linker, "/STA ...

  2. UVALive 4031 Integer Transmission(贪心 + DP)

    分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的0尽可能的向后延迟就可以了,求最大值则相反. 关键在于求出可以组合出的数字个数. 这就是组合数学版的dp了,我们让dp[i][j ...

  3. UVALive - 4636 Cubist Artwork(贪心)

    题目链接 题意 给出正视图和侧视图,判断最少用几个立方体 分析 若存在高度相同的立方块,则以数目多的那面为准. #include <iostream> #include <cstdi ...

  4. UVALive 3971 Assemble(二分+贪心)

    本题思路不难,但是要快速准确的AC有点儿考验代码功力. 看了大白书上的标程,大有所获. 用map和vector的结合给输入分组,这个数据结构的使用非常精美,恰到好处. #include<iost ...

  5. UVALive 3530 Martian Mining(贪心,dp)

    分析: 对于网格grid[i][j]如果放向上的管道,那么grid[i][k], k>j 就只能放向上的管道了. 那么定义dp[i][j]表示第i行,最后一个放向左的管道是j的最大总矿量. j ...

  6. UVALive 4731 Cellular Network(贪心,dp)

    分析: 状态是一些有序的集合,这些集合互不相交,并集为所有区域.显然枚举集合元素是哪些是无法承受的, 写出期望的计算式,会发现,当每个集合的大小确定了以后,概率大的优先访问是最优的. 因此先对u从大到 ...

  7. Gym 101194D / UVALive 7900 - Ice Cream Tower - [二分+贪心][2016 EC-Final Problem D]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  8. 贪心 UVALive 6834 Shopping

    题目传送门 /* 题意:有n个商店排成一条直线,有一些商店有先后顺序,问从0出发走到n+1最少的步数 贪心:对于区间被覆盖的点只进行一次计算,还有那些要往回走的区间步数*2,再加上原来最少要走n+1步 ...

  9. 贪心 UVALive 6832 Bit String Reordering

    题目传送门 /* 贪心:按照0或1开头,若不符合,选择后面最近的进行交换.然后选取最少的交换次数 */ #include <cstdio> #include <algorithm&g ...

随机推荐

  1. day 17 re模块

    RE模块 import re 对一个大篇幅的字符串,按照你的规则找出想要的字符串 # 单个字符匹配 import re # \w 与 \W #字母数字下划线, 非 # print(re.findall ...

  2. C#生成二维码(可保存二维码图片)

    https://www.cnblogs.com/wlays/p/7994393.html 1.NuGet中搜索QRCoder,安装这个插件. 2.创建一个一般处理程序,代码: public void ...

  3. 9.4-9.19 h5日记总结

    总结: 1.标签 (1)单.双标签 (2)块级.行级标签 (3)标签的属性 2.CSS (1)选择器 *.id.class.标签.后代.子代.并集.交集.伪类.结构 (2)层叠性,即选择器权重的计算 ...

  4. Dottrace 10.0.2 使用心得

    开发环境vs2015 软件:JetBrains dotTrace 10.0.2 刚开始不知道怎么下手,多看了一会还有一位仁兄的解释.算是对某个功能小有入门了. 当前会查看某个方法在抓取快照时间它的执行 ...

  5. C# 出现base-64 字符数组的无效长度的解决办法

    最近的一个项目,在传递参数时,在Win2003上正常,在Win7下抛出“base-64 字符数组的无效长度”这样的错误 对比了一下经过Convert.ToBase64String()转换过的参数发现, ...

  6. BZOJ1855或洛谷2569 [SCOI2010]股票交易

    一道单调队列优化\(DP\) BZOJ原题链接 洛谷原题链接 朴素的\(DP\)方程并不难想. 定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益. 转移方程可以分成四个 ...

  7. NC 6系预警类型注册

    在实际开发预警任务中,因为模块是新创建的,所以开发预警,就要在相应的节点模块注册.但这样代码就得放在相应的模块中,注册个预警类型,就可以把代码直接放在自己新建的模块. .先执行新建模块语句 inser ...

  8. 在 Ubuntu 上使用微信客户端

    原文地址: http://www.myzaker.com/article/5979115d1bc8e08c30000071/ 在这个快速信息交互时代,无论是工作还是生活,都需要频繁的网络社交,而在中国 ...

  9. django基础使用

    //创建应用 python3 manage.py startapp mysite //开启服务 python3 manage.py runserver 127.0.0.1:8080 //创建数据库命令 ...

  10. SQL 中的Begin...End语句

    Begin...End通常用来表示一个语句块,其内部的代码可以包含一组T-SQL语句,可以理解为高级语言中的{},这样在使用while循环时才知道判断什么时候结束.