当前位置: 首页 > news >正文

hdu 5348 MZL#39;s endless loop

        给一个无向图(事实上是有向的。可是没有指定边的方向),你须要指定边的方向,使得每一个点入度和出度相差不超过1。

        事实上就是找很多条路径。合起来能走完这个图。。先统计各个顶点的度。度为奇数必是起点或终点,否则是中间点或者同为起点和终点。

邻接表建图(建双向),先从每一个奇数度顶点出发找路径,再从偶数度顶点出发找路径。经过的边要删去不然超时。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <stack>

using namespace std;

const int MAXM=300010;
const int MAXN=200010;

struct edge{
	int u,v;
}edges[MAXM*2];

int head[MAXN];
int pre[MAXM*2];
int Next[MAXM*2];
int deg[MAXN];
int ans[MAXM];

int ecnt;
int n,m;

int init(){
	memset(head,-1,sizeof(head));
	memset(Next,-1,sizeof(Next));
	memset(deg,0,sizeof(deg));
	ecnt=0;
}

void addedge(int u,int v){
	edges[ecnt].u=u;	edges[ecnt].v=v;
	pre[ecnt]=head[u];
	head[u]=ecnt;
	ecnt++;
	//
	edges[ecnt].u=v;	edges[ecnt].v=u;
	pre[ecnt]=head[v];
	head[v]=ecnt;
	ecnt++;
}

void dfs(int u){
	while(head[u]!=-1){
		deg[u]--;
		int i=head[u];
		int v=edges[i].v;
		if(i&1){
			ans[(i>>1)+1]=0;
		}else{
			ans[(i>>1)+1]=1;
		}

		//remove edges.
		int pp,nn;
		if(head[u]==i){
			head[u]=pre[i];
		}
		pp=pre[i];
		nn=Next[i];
		if(pp!=-1)Next[pp]=nn;
		if(nn!=-1)pre[nn]=pp;

		int _i=i^1;

		if(head[v]==_i){
			head[v]=pre[_i];
		}
		pp=pre[_i];
		nn=Next[_i];
		if(pp!=-1)Next[pp]=nn;
		if(nn!=-1)pre[nn]=pp;

		u=v;
		if(deg[v])deg[v]--;


	}
}

int main(){
    int t;
    cin>>t;
	while(t--){
        init();

        cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v;
			scanf("%d%d",&u,&v);
			addedge(u,v);
			deg[u]++;
			deg[v]++;
		}

		for(int i=0;i<ecnt;i++){
			if(pre[i]!=-1)Next[pre[i]]=i;
		}
		for(int i=1;i<=n;i++){
			Next[head[i]]=-1;
		}

        //先处理必为起点/终点的点
		for(int i=1;i<=n;i++){
			if(deg[i]&1){
				dfs(i);
			}
		}

		for(int i=1;i<=n;i++){
			if(deg[i]){
				dfs(i);
			}
		}
		for(int i=1;i<=m;i++){
			printf("%d\n",ans[i]);
		}
	}
	return 0;
}


转载于:https://www.cnblogs.com/yutingliuyl/p/6759013.html

相关文章:

  • 对不起,我不再愛你了
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • HP SiteScope 11
  • 【版本更新】Excel控件Spire.XLS for .NET V7.12发布 | 修复多个重大bug
  • matlab集合操作
  • C++学习笔记4
  • Android开发者应该深入学习的10个开源应用项目[转]
  • /proc/vmstat 详解
  • Solr In Action 中文版 第一章(四、五)
  • 零基础学通Silverlight4(2):Expression Blend入门
  • [备忘]谷歌员工证实PR值不再更新 呼吁用户关注内容
  • 采用一个自创的验证框架实现对数据实体的验证[扩展篇]
  • sql查询优化的几个要点
  • Javascript+CSS应用小技巧
  • Active Directory还原工具之二Quest Object Restore for Active Directory
  • 深入了解以太坊
  • css的样式优先级
  • es6(二):字符串的扩展
  • leetcode讲解--894. All Possible Full Binary Trees
  • spring-boot List转Page
  • Windows Containers 大冒险: 容器网络
  • 闭包--闭包作用之保存(一)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 前端性能优化——回流与重绘
  • 如何优雅地使用 Sublime Text
  • 用Visual Studio开发以太坊智能合约
  • 自定义函数
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 你对linux中grep命令知道多少?
  • Linux权限管理(week1_day5)--技术流ken
  • Spring第一个helloWorld
  • 关于Android全面屏虚拟导航栏的适配总结
  • (06)金属布线——为半导体注入生命的连接
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (5)STL算法之复制
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (poj1.2.1)1970(筛选法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)hibernate配置管理
  • (二)pulsar安装在独立的docker中,python测试
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)linux文件内容查看
  • (四)模仿学习-完成后台管理页面查询
  • (转)母版页和相对路径
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *上位机的定义
  • .gitignore文件---让git自动忽略指定文件
  • .htaccess配置重写url引擎
  • .java 9 找不到符号_java找不到符号
  • .NET 8.0 发布到 IIS
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 中使用 Mutex 进行跨越进程边界的同步