题目链接:https://codeforces.com/contest/19/problem/E

#include <iostream>
#include <cstring>
using namespace std;
static const int MAXN=1e4+10;
static const int MAXM=2e4+10;
struct Edge{int u,v;bool trEdge;int odd,even;
}edge[MAXN];
int n,m;
int h[MAXN],e[MAXM],ne[MAXM],idx;
void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; }
bool vis[MAXN];
int dep[MAXN],odd[MAXN],even[MAXN];
int ans[MAXN],anscnt;
void dfs(int u,int d)
{vis[u]=true; dep[u]=d;for(int i=h[u];~i;i=ne[i]){int v=e[i];if(!vis[v]){edge[i>>1].trEdge=true;dfs(v,d+1);}}
}
void dfs_count(int u)
{vis[u]=true;for(int i=h[u];~i;i=ne[i]){int v=e[i];if(!vis[v]){dfs_count(v);odd[u]+=odd[v]; even[u]+=even[v];edge[i>>1].odd+=odd[v]; edge[i>>1].even+=even[v];}}
}
int main()
{scanf("%d%d",&n,&m);memset(h,-1,sizeof(h));for(int i=0;i<m;i++){int u,v;scanf("%d%d",&edge[i].u,&edge[i].v);add(edge[i].u,edge[i].v);add(edge[i].v,edge[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(edge[i].trEdge) continue;int u=edge[i].u,v=edge[i].v;if(dep[u]>dep[v]) swap(u,v);if((dep[u]-dep[v])&1) even[u]--,even[v]++;else odd[u]--,odd[v]++,edge[i].odd++,cnt++;}if(!cnt){printf("%d\n",m);for(int i=0;i<m;i++) printf("%d ",i+1);}else{memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++) if(!vis[i]) dfs_count(i);anscnt=0;for(int i=0;i<m;i++)if(edge[i].trEdge){if(!edge[i].even && edge[i].odd==cnt) ans[anscnt++]=i+1;}else if(cnt==1 && edge[i].odd) ans[anscnt++]=i+1;printf("%d\n",anscnt);for(int i=0;i<anscnt;i++)printf("%d ",ans[i]);}return 0;
}

CodeForces - 19E Fairy【二分图】【DFS】相关推荐

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

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

  2. Codeforces 19E Fairy

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

  3. codeforces 19E Fairy 树链剖分

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

  4. Codeforces 19E DFS 树

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

  5. CodeForces 991E Bus Number DFS+ 组合数

    CodeForces 991E Bus Number DFS+ 组合数 题目大意:给定一个数字,数字里出现的每一个数,都至少要用一个,问能组成多少个新数,不加前导零. input: 2028 outp ...

  6. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,要求给 n 个点赋值为 1 . 2 或 3 ,需要满足以下条件: 每个点都需要被赋值 权值为 1 的点共 n1 个 权值为 ...

  7. CodeForces 19E 仙女fairy

    CF19E 话说标题"仙女",好骚啊.... 这道题的题面核心是图论二分图.满足删除一条边,可以形成一张二分图.求可以删除的边数,并输出是那些边. 出题人非常良心的给出了前六十分的 ...

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

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

  9. Bipartite Segments CodeForces - 901C (区间二分图计数)

    大意: 给定无向图, 无偶环, 每次询问求[l,r]区间内, 有多少子区间是二分图. 无偶环等价于奇环仙人掌森林, 可以直接tarjan求出所有环, 然后就可以预处理出每个点为右端点时的答案. 这样的 ...

最新文章

  1. C++中基于范围的for循环
  2. 纯CSS美化单复选框(checkbox、radio)
  3. Python四大金刚之二:字典
  4. 基于Java+SpringMvc+vue+element实现高效学生社团平台管理
  5. SpringBoot与任务
  6. ubuntu安装arm-linux-gcc
  7. 【linux指令】dialog实现终端下的GUI-1
  8. chkconfig命令及的使用 与linux的七个运行级别
  9. Eclipse 工具的安装和配置
  10. SAP 物料成本核算冻结:料号. 不能过账,是否取消?消息 CK167
  11. Eplan绘图软件:Eplan P8 2.9 SP1破解
  12. Akka-CQRS(15)- Http标准安全解决方案:OAuth2+JWT
  13. 女生什么样的表现会说明她喜欢你?——男生记得都看一遍,谨记~
  14. vue中使用iview修改Cascader的默认数据
  15. 浦江县教育计算机网上网认证系统,上网认证系统使用说明
  16. Excel VBA 学习过程记录
  17. c语言致命错误无法打开网页,电脑中IE浏览器显示异常或无法打开网页崩溃的解决方法...
  18. ubuntu php开发工具
  19. 登陆共享服务器的用户名和密码怎么修改
  20. 起码我们曾经爱过,不是吗

热门文章

  1. 爬梯:MongoDB入门到高级到SpringBoot-API
  2. U盘文件恢复,3个方法恢复教程
  3. barcode.jar处理条形码
  4. Java面向对象之创建和使用对象——定义学生/教师类并输出相关信息
  5. IDEA无法启动:error launching idea (Failed to create JVM )
  6. 2022年武汉市级产业化投资和技术改造专项以及工业智能化改造专项申报开始!13区申报条件、1千万补助
  7. 每天学命令write_ldb
  8. 【微信小程序】接口生成自定义首页二维码
  9. NumPy的实用函数整理之percentile
  10. 中国移动、联动、电信