codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP
【题意】
给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1.
【分析】
从结论入手,每个点的度恰好为1,那么就意味着每个点只能连接一个点,这样问题就转化为图中的点能否刚好两两配对。
对于奇数个点肯定是不行的,因为一定存在一个点不存在与之配对的点。
如果点是偶数,那么就要求这个图的最大匹配,看匹配树是否为点数的一半。
求匹配的方法和二分图类似,不断找增广路更新匹配数就好了。
【代码】
第一次手写增广路代码~写的时候忘记判断增广路是否重点了于是WA了,还好后来想到了。
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <iostream>
#include<algorithm>
using namespace std;
int n,m;
int map[][];
int match[][];
int du[];
int path[];
bool ifv[];
int be;
bool dfs(int i,int k)
{
if ((k&) && !du[i] )
{
int t=k-;
while (t>=)
{
if (match[i][path[t]]==) {++du[i];++du[path[t]];}
else {--du[i];--du[path[t]];}
match[i][path[t]]=!match[i][path[t]];
match[path[t]][i]=!match[path[t]][i];
i=path[t];
--t;
}
return true;
}
for (int j=;j<=n;++j)
{
if (map[i][j]==-) continue;
if (match[i][j]!=(k&) ) continue;
if (ifv[j]) continue;
path[k]=i;
ifv[j]=true;
if (dfs(j,k+)) return true;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
memset(map,-,sizeof map);
memset(match,,sizeof match);
memset(du,,sizeof du);
scanf("%d%d",&n,&m);
for (int i=;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=;
}
if (n&) puts("NO");
else
{
int ans=;
for (int i=;i<=n;++i)
{
memset(ifv,,sizeof ifv);
ifv[i]=true;
if (!du[i] && dfs(i,)) ++ans;
}
if (ans==n/) puts("YES"); else puts("NO");
}
}
}
codechef January Challenge 2014 Sereja and Graph的更多相关文章
- codechef January Challenge 2017 简要题解
https://www.codechef.com/JAN17 Cats and Dogs 签到题 #include<cstdio> int min(int a,int b){return ...
- CodeChef November Challenge 2014
重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...
- Codechef March Challenge 2014——The Street
The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- 刷漆(Codechef October Challenge 2014:Remy paints the fence)
[问题描述] Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏, ...
- [Codechef October Challenge 2014]刷漆
问题描述 Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏,木板 ...
- Codechef December Challenge 2014 Chef and Apple Trees 水题
Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...
- codechef September Challenge 2017 Sereja and Commands
———————————————————————————— 这道题维护一下原序列的差分以及操作的差分就可以了 记得倒着差分操作 因为题目保证操作2的l r 小与当前位置 #include<cstd ...
- AC日记——The Street codechef March challenge 2014
The Street 思路: 动态开节点线段树: 等差序列求和于取大,是两个独立的子问题: 所以,建两颗线段树分开维护: 求和:等差数列的首项和公差直接相加即可: 取大: 对于线段树每个节点储存一条斜 ...
随机推荐
- JSP文件下载时文件名在ie和firefox下面文件名不一致极其超链接中文乱码的问题的改进
response.setContentType("application/octet-stream;charset=UTF-8"); fileName=java.net.URLEn ...
- sql 自连接
这是一个部门表,里面存放了部门及其上级部门,但都放在同一张表中,我们假设现在需要用SQL查询出各部门及其上级部门!就如何做,当然,不用自连接也一样,可以如下: 我们达到预期目的!在这个查询中使用了一个 ...
- 函数 MultiByteToWideChar() 详解
函数原型: int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte ...
- 钉钉开发笔记(3)MySQL的配置
最近在编写web的过程中,经常需要与后台工作人员互动.由于比较麻烦.没有效率. 就果断的请教了,公司的后台大牛,学习下数据库的一些简单操作,现在就把利用MySQL连接服务器, 进行可视化操作的简单步骤 ...
- 关于使用Transaction对于非数据库事务的操作
在操作数据库的过程中,为了数据的一致性,我们可以使用Transaction,要么成功的时候全部提交,要么有任何一个操作失败立即全部回滚.不仅仅是在数据库方面,有时候操作其他的内容,比如说对于系统文件的 ...
- U8记账凭证修改方法汇总
在输入记账凭证时,尽管账务系统提供了多种控制错误的措施,但错误凭证的出现是难免的,为此,系统必须能够提供对错误凭证修改的功能.目前,许多财 务软件(如:用友.安易.三门)都提供了“反审核.反记账.反结 ...
- CSS 强制换行和禁止换行学习
强制换行 1.word-break: break-all; 只对英文起作用,以字母作为换行依据. 2.word-wrap: break-word; 只对英文起作 ...
- opencv官网
http://wiki.opencv.org.cn/index.php/Template:Doc
- 【JavsScript】webapp的优化整理
单页or多页 webapp 现状 优劣之分 网络传输优化 综述 fake页-首屏加速 降低请求数 降低请求量 缓存Ajax/localstorage DOM操作优化 综述 关于页面渲染 减少使用定位属 ...
- [ES6] 14. Generator -- 1. yield & next()
Generators in ECMAscript 6 are first-class coroutines that produce encapsulated suspended execution ...