hdu 5348 MZL's endless loop(15多校第五场1006) 欧拉路
2015-08-05 20:44
357 查看
//15多校第五场1006 //hdu5348 MZL's endless loop //若图中都是偶点,那么一定符合条件 //若有奇点,我们的目标就是消除奇点。 //从奇点出发,终止于一个奇点变为偶点的位置 //奇点除去一条边变为偶点 //从奇点一直出发直到图中都是偶点,这样直接跑欧拉回路即可。 //要证明 //1.从奇点出发只会使奇点变成偶点,不会改变偶点 //2.从奇点出发一定会令图中全是偶点。 //3.从奇点出发,终止于奇点的路符和条件 //证明1:从奇点出发不经过偶点,不会使偶点变成奇点。 // 若经过原本偶点的位置,不会终止,则会令度数减2,依然为偶点。 //证明2:不会影响偶点,且使首尾两个奇点度数减1,变为偶点。 //证明3:此路对中间偶点不影响(一进一出) //令首尾奇点出入度数+1或-1 (剩下的偶数度可以通过欧拉回路平衡) //基于以上三条,我们可以用通过去掉奇--偶--奇的路来获取欧拉图 //全是偶点的图存在欧拉回路。(欧拉回路存在的条件) //事实上,一个图中,点要么为奇点,要么为偶点, //我们消除了奇点,偶点一定可以用欧拉回路构图。 //而奇点一定可以消除。所以任何图都可以有解。 #pragma comment(linker, "/STACK:102400000,102400000") #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> using namespace std; const long long mod=1e9+7; typedef long long LL; const int maxn= 101000,maxm=6*100010; queue<int>Q; int head[maxn]; struct edge{ int from,to,next; }edge[maxm]; int cnt; int deg[maxn]; int vis[maxm]; int dir[maxm]; void init(){ cnt=0; memset(head,-1,sizeof(head)); memset(deg,0,sizeof(deg)); memset(vis,0,sizeof(vis)); } void addedge(int u,int v){ edge[cnt].from=u;edge[cnt].to=v; edge[cnt].next=head[u];head[u]=cnt++; } void dfs(int u){ for(int i=head[u];i!=-1;i=edge[i].next,head[u]=i){ if(!vis[i]&&!vis[i^1]){ vis[i]=vis[i^1]=1; int v=edge[i].to; deg[u]--;deg[v]--; dir[i]=dir[i^1]=v; if(deg[v]%2==1)dfs(v); return; } } } void dfs2(int u){//套圈法找欧拉回路 for(int i=head[u];i!=-1;i=edge[i].next,head[u]=i){ if(!vis[i]&&!vis[i^1]){ vis[i]=vis[i^1]=1; int v=edge[i].to; deg[u]--;deg[v]--; dir[i]=dir[i^1]=v; dfs(v); } } } int main(){ int T; scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); init(); int u,v; for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); deg[u]++; deg[v]++; } for(int i=1;i<=n;i++){ if(deg[i]%2==1)Q.push(i);//所有奇点入队 } while(!Q.empty()){ int top=Q.front();Q.pop(); if(deg[top]%2==1)dfs(top); } for(int i=1;i<=n;i++){ if(deg[i]>0){ dfs2(i); } } for(int i=0;i<2*m;i+=2){ if(dir[i]==edge[i].to){ printf("1\n"); } else{ printf("0\n"); } } } return 0; }
相关文章推荐
- 新手的linux之旅 三、连网
- 运维工程师必学技能
- linux下的vim快捷键
- zookeeper运维taokeeper部署
- 虚拟化项目之运维实践
- Linux tr 命令
- 待解决 --- 自定义类的类对象字段,存取器必须使用copy,否则报错!!! why???
- Linux下压缩某个文件夹(文件夹打包)
- 新手的linux之旅 二、进入启动盘界面
- nginx 进行外网地址屏蔽
- tomcat配置虚拟目录映射
- Linux 信号理解(二)
- hdu 5348 MZL's endless loop dfs
- Hadoop-HBASE 热添加新节点
- linux使用普通账户时,无法登录,提示“-bash: fork: retry: Resource temporarily unavailable”
- Linux时间子系统之一:clock source(时钟源)
- ubuntu下QQ下载和登陆(pidgin)
- 新手的linux之旅 一、准备工作
- Ubuntu 14.10 下Hadoop 错误集
- shell计算日期之间的天数