CF19E
话说标题“仙女”,好骚啊。。。。

这道题的题面核心是图论二分图。满足删除一条边,可以形成一张二分图。求可以删除的边数,并输出是那些边。

出题人非常良心的给出了前六十分的暴力分,只要你暴力枚举每条边,再二染色判断是否为二分图即可。在windows环境下,如果忘记手动开栈或者不选择非递归形式,我们就可以获得五十分的好成绩。

正确做法是考虑奇环,有奇环就没有二分图,所以我们要破坏掉所有的奇环。用一个tarjan老先生常用的反向边算法,在树上差分标记奇环和偶环的每条边。如果没有奇环则可以破坏任意条边,否则破坏所有不在偶环在奇环的边。

具体不解释,代码部分有随手打的注释:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int MAXN = 1e4+5;
const int inf = 1e9;
int n,m;
int tot,head[MAXN];
struct edge
{int v,next;
}edge[MAXN<<1];
void add(int u,int v)
{edge[tot].v=v;edge[tot].next =head[u];head[u]=tot++;
}
struct link
{int u,v;int odd,even;//odd->奇数,even->偶数 bool flag;//1为竖边,0为反向边
} link[MAXN];
//建立dfs树,划分竖边,记录深度
bool vis[MAXN];
int deep[MAXN];
void dfs(int u,int d)
{vis[u]=1;deep[u]=d;for(int i=head[u];~i;i=edge[i].next){int v = edge[i].v;if(!vis[v]){link[i>>1].flag = 1;dfs(v,d+1);}}
}
//统计每条边所在奇偶环数量
int odd[MAXN],even[MAXN];
void dfs_count(int u)
{vis[u] = 1;for(int i = head[u]; ~i; i = edge[i].next){int v = edge[i].v;if(!vis[v]){dfs_count(v);odd[u] += odd[v];even[u] += even[v];link[i>>1].odd = odd[v];link[i>>1].even = even[v];}}
}
//记录答案,树上差分
int ans_cnt;
int ans[MAXN];
int main()
{freopen("fairy.in","r",stdin);freopen("fairy.out","w",stdout);scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));tot = 0;for(int i = 0; i < m; ++i){scanf("%d%d",&link[i].u,&link[i].v);add(link[i].u,link[i].v);add(link[i].v,link[i].u);}for(int i = 1; i <= n; ++i)if(!vis[i])dfs(i,1);int cnt = 0;for(int i = 0; i < m; ++i){if(link[i].flag)continue;//找到一条反向边 int u = link[i].u;int v = link[i].v;if(deep[u] > deep[v])swap(u,v);if((deep[v] - deep[u])&1)even[u]--,even[v]++;//差分偶数 else odd[u]--,odd[v]++,link[i].odd++,cnt++;//差分奇数,这是一个奇环 }//如果不存在奇环if(!cnt){printf("%d\n",m);for(int i = 0; i < m; ++i)printf("%d ",i+1);return 0;}//存在奇环,先统计每条边所在的奇偶环数量memset(vis,0,sizeof vis);for(int i = 1; i <= n; ++i)if(!vis[i])dfs_count(i);//统计答案ans_cnt=0;for(int i=0;i<m;++i){if(link[i].flag)//如果是竖边{if(!link[i].even&&link[i].odd==cnt)ans[ans_cnt++] = i+1;}else//反向边 if(cnt == 1 &&link[i].odd)ans[ans_cnt++] = i+1;}printf("%d\n",ans_cnt);for(int i = 0; i < ans_cnt; ++i)printf("%d ",ans[i]);return 0;
}

CodeForces 19E 仙女fairy相关推荐

  1. Codeforces 19E DFS 树

    题意 传送门 Codeforces 19E Fairy 题解 若图中不存在非二分图的连通分量,则任意一边删除后仍是二分图:若图中存在大于一个非二分图的连通分量,则不可能通过删除一条边使之变为二分图.故 ...

  2. CodeForces - 19E Fairy【二分图】【DFS】

    题目链接:https://codeforces.com/contest/19/problem/E #include <iostream> #include <cstring> ...

  3. BZOJ4424 Cf19E Fairy(codeforces 19E/洛谷CF19E)

    树上差分 DFS BZOJ题目传送门 codeforces题目传送门 洛谷题目传送门 首先只有当图中没有奇环时一张图才能够二分图染色.因为只允许删一条边,那么答案就是所有奇环的交,并且奇环不能和偶环有 ...

  4. [二分图]Codeforces 19E. Fairy

    DescriptionDescription 你有一个nn个点mm条边的无向图. 对于每条边,判断删除之后是否为二分图. n,m≤104n,m\le10^4 SolutionSolution 一个图是 ...

  5. Codeforces 19E Fairy

    Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成 一个二分图. [题目分析] 手玩一下,发现删除的是奇环的交集,而且不在偶环上的点,然后乱搞就可 ...

  6. codeforces 19E Fairy 树链剖分

    题意: 给定一张无向图,求有多少条边保证删掉它之后能将该图转化成二分图. 解析: 首先二分图没有奇环. 我们可以dfs出一棵树. 这时候,非树边都是返祖边. 每一条非树边和树边都可以构成一个环. 我们 ...

  7. 女王节快乐?只是想要你的钱而已

    3月8日是国际妇女节(International Women's Day,简写IWD)全称"联合国妇女权益和国际和平日"(United Nations women's rights ...

  8. Anton and Fairy Tale CodeForces - 785C(二分+思维)

    Anton likes to listen to fairy tales, especially when Danik, Anton's best friend, tells them. Right ...

  9. CodeForces 785C Anton and Fairy Tale 二分

    题意: 有一个谷仓容量为\(n\),谷仓第一天是满的,然后每天都发生这两件事: 往谷仓中放\(m\)个谷子,多出来的忽略掉 第\(i\)天来\(i\)只麻雀,吃掉\(i\)个谷子 求多少天后谷仓会空 ...

最新文章

  1. 不可思议的Word2Vec系列一数学原理
  2. Windows的驱动开发模型
  3. mybatis获取mysql存储过程out参数的值_mybatis接受mysql存储过程out的值
  4. Highcharts图表-ajax-获取json数据生成图表
  5. 用于数据科学的Python库,命令行工具,Jenkins X,DevOps,Perl 6等
  6. 18. GD32F103C8T6入门教程-adc-使用教程5-定时器TIM2更新事件触发adc0
  7. English trip V2-B 5 Apartment Living 公寓生活 Teacher:Tom
  8. spark架构设计编程模型 02
  9. MUSIC算法的参数设置
  10. 候鸟浏览器cookie登录教程
  11. 梵语和藏语_《百字明》梵文和藏文发音区分
  12. 计算机一些简单快捷键,最全的电脑常用快捷键大全 电脑快捷键使用大全
  13. 悼念512汶川大地震遇难同胞
  14. 中国城市乞丐的五大经典表情
  15. Android的发布与更新
  16. 目标检测--RFBNet训练自己制作数据集出现loss=nan问题的解决方法
  17. swift学习笔记一
  18. 【C语言小游戏】计算器
  19. 为什么是国际标准化组织是ISO而不是IOS
  20. 解决git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to ‘

热门文章

  1. win10 android叹号,win10网络连接感叹号如何解决
  2. 南大软院大神养成计划--HTML和CSS基础课程(二)
  3. Unity切割图片:把一张图片中的物体裁成多个单独的游戏物体
  4. 有什么方法可以把WPS转为Word:小白教你一招搞定
  5. 智慧城市背景下智慧消防建设的SWOT分析
  6. 《图解TCP/IP》——第一章 网络基础知识
  7. vivado 如何添加时序约束
  8. 玩转oj之1003题(地球人口承载力估计)
  9. SParC: Cross-Domain Semantic Parsing in Context 论文解读
  10. 那些爆火的游戏背后,是如何让你一步一步上瘾的?