HDU 5348 MZL's endless loop(DFS去奇数度点+欧拉回路)
2024-10-17 00:35:57
题目链接: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 ;
}
最新文章
- 常用SQL[ORACLE]
- oschina(开源中国)的Git代码托管平台使用教程
- Vue.js之v-for
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本新增序列管理
- Java/Android引用类型及其使用分析
- FragmentTransaction.replace() 你不知道的坑
- Beaglebone Black&ndash;I2C 接 BMP280 获取当前温度
- SQLite 字段类型
- jquery技巧总结
- HDU 整除的尾数 2099
- AspxGridView 主子表设置
- Truncating HTML attribute value in SharePoint DataFormWebPart
- Python装饰器学习(九步入门)
- (二)Web应用体系结构
- 【AGC 005F】Many Easy Problems
- 加密:HashUtils,RSAUtil,AESUtils
- AJAX的简单解释
- Exp2后门原理与实践_20154305 _ 齐 帅
- LeetCode每天一题之两数之和
- callback vs async.js vs promise vs async / await
热门文章
- 【BZOJ4129】Haruna’s Breakfast(树上莫队)
- python之快速排序
- mysql权限管理,用户管理
- Mac连接HDMI后没有声音
- PID控制算法的C语言实现二&#160;PID算法的离散化
- Codeforces Round #546 (Div. 2) ABCDE 题解
- 图片虚拟目录--即图片保存在window硬盘上面
- &#39;0&#39;,&#39;\0&#39;,NULL,EOF的区别
- 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
- 贪心法:K叉哈夫曼树