这个题目要求把一个无向连通图里面的所有边,分成 两个一对,只能出现一次,而且一对边必须是连在一起的,点可以复用  但边不可复用

可解条件很易得,因为图是连通的,只要边数为偶数即可。

一开始我借着做欧拉回路的方法,直接DFS暴搜,沿路做标记,遇到未标记的连续两条边 输出即可

不过 事实证明这个算法是错的

暴搜能成立只是建立在图上的边可以存在很多个边对里,但肯定有图不满足这种条件

其实解决方法也就是在DFS的基础上对特殊边进行下考虑即可

即每次对某个点,对子节点进行dfs,如果发现子节点下面有落单的边,则将当前边和子节点的落单边组合起来 输出

否则就把当前边存进该点独有的队列中,全部存完后,两两进行输出,如果有落单边,给父亲返回,告诉他这里有落单边 即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N=+;
int u[N<<],v[N<<],nt[N<<],ft[N];
int n,m,cnt;
int vis[N<<];
void add(int a,int b)
{
u[cnt]=a;
v[cnt]=b;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
int dfs(int x,int f)
{
queue<int> vec;
for (int i=ft[x];i!=-;i=nt[i]){
int nx=v[i];
if (vis[i] || nx==f) continue;
vis[i]=vis[i^]=;
int r=dfs(nx,x);
if (r){
printf("%d %d %d\n",x,nx,r);
}
else{
vec.push(nx);
}
}
while (vec.size()>=){
int a=vec.front();
vec.pop();
int b=vec.front();
vec.pop();
printf("%d %d %d\n",a,x,b);
}
if (!vec.empty()){
int a=vec.front();
vec.pop();
return a;
}
return ;
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
cnt=;
memset(ft,-,sizeof ft);
memset(vis,,sizeof vis);
int a,b;
for (int i=;i<m;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
//cout<<m<<" "<<(m&1)<<endl;
if (m&){
puts("No solution");
continue;
}
dfs(,-);
}
return ;
}

最新文章

  1. sql 代码调试
  2. TColor 与 RGB 的转换函数
  3. mysql5.7 密码策略
  4. web工程依赖的问题
  5. Java AIO 异步IO应用实例
  6. SQL面试积累
  7. golang的nil
  8. 推荐系统之LFM
  9. 《OD大数据实战》驴妈妈旅游网大型离线数据电商分析平台
  10. Css3 阴影效果
  11. Tomcat-java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
  12. 优酷播放器demo
  13. KJFrameForAndroid框架学习----高效设置网络图片
  14. ASP.NET页面传值方式
  15. 键盘过滤第一个例子ctrl2cap(4.1~4.4)汇总,测试
  16. java异常基础知识点
  17. Java开源博客My-Blog之docker组件化修改
  18. ArcGIS JavaScriptAPI----- 缓冲区操作
  19. Oracle hint之ORDERED和USE_NL
  20. flask 安装及基础学习(url_for反转,静态文件引入)

热门文章

  1. Linux 下JDK安装
  2. 拖放获取文件信息的bat代码
  3. 免费的 Linux 分区管理器使用介绍
  4. oozie的常见错误
  5. ROS学习笔记2-基本概念
  6. 基于LAMP实现后台活动发布和前端扫码签到系统
  7. Java笔记--基础
  8. PHP 跨域之header
  9. HDU - 3729 I&#39;m Telling the Truth(二分匹配)
  10. Kafka--windows下简单使用kafka命令