#欧拉回路#HDU 5348 MZL's endless loop
题目
给无向图定向,使每个点的入度与出度之差绝对值不超过一。
分析
考虑沿欧拉回路方向定向后的入度与出度之差为 ,而欧拉回路可以是全为偶点的无向图,
所以对于奇点直接连虚拟边就能使其不超过一,对于每个连通分支分别使用 Hierholzer 算法找出欧拉回路并定向。
注意:一定要使用当前弧优化,不然会 TLE。
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100011;
struct node{int y,next;}e[N<<3];
int v[N],as[N],mark[N<<3],deg[N],n,m,et;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void dfs(int x){
v[x]=1;
for (int &i=as[x];i;i=e[i].next)
if (mark[i]==-1){
mark[i]=1,mark[i^1]=0;
dfs(e[i].y);
}
}
int main(){
memset(mark,0xff,sizeof(mark));
for (int T=iut();T;--T){
n=iut(),m=iut(),et=1;
for (int i=1;i<=m;++i){
int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et,++deg[x];
e[++et]=(node){x,as[y]},as[y]=et,++deg[y];
}
for (int i=1,lst=0;i<=n;++i)
if (deg[i]&1){
if (lst){
e[++et]=(node){i,as[lst]},as[lst]=et;
e[++et]=(node){lst,as[i]},as[i]=et;
lst=0;
}else lst=i;
}
for (int i=1;i<=n;++i) if (!v[i]) dfs(i);
for (int i=1;i<=m;++i) putchar(mark[i<<1]+48),putchar(10);
for (int i=1;i<=n;++i) deg[i]=as[i]=v[i]=0;
for (int i=2;i<=et;++i) mark[i]=-1;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2023-10-28 #期望dp#CF1810G The Maximum Prefix
2023-10-28 #ST表#CF1879F Last Man Standing
2020-10-28 #莫比乌斯反演,整除分块,欧拉定理#U137539 虚伪的最小公倍数