题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348

题目大意:给你一张图,有n个点,和m条无向边,让你把m条无向边变成有向边,使得每个节点的|出度-入度|<=1。

解题思路:先找出所有度数为奇数的点入队,然后依次从这些奇数点开始dfs到另一个奇数点停止。那样就能保证图中是剩下偶数点了,剩下的偶数点肯定会形成欧拉回路(若干个),有套圈法判断路径方向即可。

代码:

 #include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
const int N=1e5+;
const int M=3e5+; struct node{
int next,to,w;
}edge[*M]; int n,m,idx;
int degree[N],head[N],dir[M];
bool vis[M]; void init(){
idx=;
CLR(head,);
CLR(degree,);
CLR(vis,false);
} void addedge(int u,int v,int w){
edge[idx].next=head[u];
edge[idx].to=v;
edge[idx].w=w;
head[u]=idx++;
} void dfs1(int u){
for(int &j=head[u];j;j=edge[j].next){
node t=edge[j];
if(!vis[j>>]){
vis[j>>]=true;
degree[u]--;
degree[t.to]--;
dir[j>>]=t.w;
if(degree[t.to]%==)
dfs1(t.to);
return; //注意这里要return
}
}
} //套圈法找欧拉回路
void dfs2(int u){
for(int &j=head[u];j;j=edge[j].next){
node t=edge[j];
if(!vis[j>>]){
vis[j>>]=true;
degree[u]--;
degree[t.to]--;
dir[j>>]=t.w;
dfs2(t.to);
}
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
degree[u]++;
degree[v]++;
addedge(u,v,);
addedge(v,u,);
}
queue<int>q;
for(int i=;i<=n;i++){
if(degree[i]%==)
q.push(i); //所有奇点入队
}
//消除奇数点
while(!q.empty()){
int t=q.front();
q.pop();
if(degree[t]%==){
dfs1(t);
}
}
//找欧拉回路
for(int i=;i<=n;i++){
if(degree[i]>)
dfs2(i);
}
for(int i=;i<=m;i++){
printf("%d\n",dir[i]);
}
}
return ;
}

最新文章

  1. 常用SQL[ORACLE]
  2. oschina(开源中国)的Git代码托管平台使用教程
  3. Vue.js之v-for
  4. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本新增序列管理
  5. Java/Android引用类型及其使用分析
  6. FragmentTransaction.replace() 你不知道的坑
  7. Beaglebone Black&ndash;I2C 接 BMP280 获取当前温度
  8. SQLite 字段类型
  9. jquery技巧总结
  10. HDU 整除的尾数 2099
  11. AspxGridView 主子表设置
  12. Truncating HTML attribute value in SharePoint DataFormWebPart
  13. Python装饰器学习(九步入门)
  14. (二)Web应用体系结构
  15. 【AGC 005F】Many Easy Problems
  16. 加密:HashUtils,RSAUtil,AESUtils
  17. AJAX的简单解释
  18. Exp2后门原理与实践_20154305 _ 齐 帅
  19. LeetCode每天一题之两数之和
  20. callback vs async.js vs promise vs async / await

热门文章

  1. 【BZOJ4129】Haruna’s Breakfast(树上莫队)
  2. python之快速排序
  3. mysql权限管理,用户管理
  4. Mac连接HDMI后没有声音
  5. PID控制算法的C语言实现二&#160;PID算法的离散化
  6. Codeforces Round #546 (Div. 2) ABCDE 题解
  7. 图片虚拟目录--即图片保存在window硬盘上面
  8. &#39;0&#39;,&#39;\0&#39;,NULL,EOF的区别
  9. 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
  10. 贪心法:K叉哈夫曼树