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

题目大意:给出一幅无向图,问是否存在一种方案,使得给每条边赋予方向后,每个点的入度与出度之差小于等于1。如不存在,输出-1;存在,则按边的输入顺序输出方向。

比如:若给出第 m 条边为 u,v,则在对应第m行输出0表示u->v,输出1表示u<-v。

解题思路:

首先证明一定可以构造出符合要求的图。

对于一个环,显然可以使得其内的每个点入度与出度相等。之后可以把环看成点。

对于一棵树,则可以通过均分其子结点使得入度与出度之差小于等于1。

因此可以看作是把图分成由环和点构成的森林。则一定有解。

dfs遍历,首先遍历度数为奇数的点,因为这些点一定是起点或者终点。遍历完之后删去遍历过的边。

再遍历剩下的边。

代码中给ans[(id>>1)+1]的赋值,是因为每输入一条边,都向邻接表中加入两条有向边,因此边的本身序号 id 与在邻接表中的序号 id‘ 的关系为

id'>>1=id。这里 id' 为(0,1),(2,3)....因此直接除以2得到对应的序号。+1则只是为了使其在ans数组中从 1 开始储存。看个人习惯。

也算是被逼着学了下数组的邻接表用法。之前只会用vector的邻接表。

对结点 i ,head[i]表示以结点 i 为起点的最后一条加入的边,初始化为-1。

对边 j ,pre[j]表示与边 j 同起点的上一条边的编号,或者说再Edge数组中的序号;nxt[j]则表示同起点的下一条边的编号。

可以用to[j]表示边 j 的终点。也可以用结构体维护起点和终点的关系。

cost[j] 表示边 j 的边权。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 200005
#define M 600005
struct edge{
int u,v;
edge(){}
edge(int u,int v):u(u),v(v){}
}Edge[M];
int head[N],pre[M],nxt[M],du[N],ans[M>>],E;
int n,m,t,a,b;
void init(){
memset(head,-,sizeof(head));
memset(nxt,-,sizeof(nxt));
memset(du,,sizeof(du));
E=;
}
void addedge(int u,int v){
Edge[E]=edge(u,v);
pre[E]=head[u];
head[u]=E;
E++;
Edge[E]=edge(v,u);
pre[E]=head[v];
head[v]=E;
E++;
}
void dfs(int u){
while(head[u]!=-){
du[u]--;
int id=head[u],v=Edge[id].v;
if(id&) ans[(id>>)+]=;
else ans[(id>>)+]=;
int Pre,Nxt;
head[u]=pre[id];
Pre=pre[id];
Nxt=nxt[id];
if(Pre!=-) nxt[Pre]=Nxt;
if(Nxt!=-) pre[Nxt]=Pre;
id^=;
if(head[v]==id)
head[v]=pre[id];
Pre=pre[id];
Nxt=nxt[id];
if(Pre!=-) nxt[Pre]=Nxt;
if(Nxt!=-) pre[Nxt]=Pre; u=v;
if(du[v]) du[v]--;
}
}
int main(){
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%d%d",&a,&b);
addedge(a,b);
du[a]++,du[b]++;
}
for(int i=;i<E;i++) if(pre[i]!=-)
nxt[pre[i]]=i;
for(int i=;i<=n;i++)
nxt[head[i]]=-;
for(int i=;i<=n;i++) if(du[i]&)
dfs(i);
for(int i=;i<=n;i++) if(du[i])
dfs(i);
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}

2015 多校赛 第五场 1006 (hdu 5348)的更多相关文章

  1. 2015 多校赛 第五场 1010 (hdu 5352)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 看题看得心好累. 题目大意: 给出 n 个点,依次执行 m 次操作:输入“1 x”时,表示将与 ...

  2. 2015 多校赛 第七场 1011 (hdu 5379)

    题意:给定一棵树,树上有 n 个节点.问有多少种方案,使得在每个节点上依次放置数 1~n 后,每个节点的儿子节点上的数连续(比如 1 为根,有1-2,1-3,1-4,则令2,3,4上的数连续),每个子 ...

  3. 2015 多校赛 第四场 1010 (hdu 5336)

    Problem Description XYZ is playing an interesting game called "drops". It is played on a r ...

  4. 2015 多校赛 第四场 1009 (hdu 5335)

    Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit) ...

  5. 2015 多校赛 第三场 1002 (hdu 5317)

    Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...

  6. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  7. 【杂题总汇】HDU多校赛第十场 Videos

    [HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...

  8. hdu5379||2015多校联合第7场1011 树形统计

    pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...

  9. 2015 GDUT校赛

    周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . ...

随机推荐

  1. Spring装配之——JAVA代码装配Bean

    首先创建几个普通的JAVA对象,用于测试JAVA代码装配bean的功能. package soundsystemJava; //作为接口 定义了CD播放器对一盘CD所能进行的操作 public int ...

  2. ceph对接openstack环境

    环境准备: 保证openstack节点的hosts文件里有ceph集群的各个主机名,也要保证ceph集群节点有openstack节点的各个主机名 一.使用rbd方式提供存储如下数据: (1)image ...

  3. OSI 7层模型和 TCP/IP 5层模型

    网络协议通常分不同层次进行开发,每一层分别负责不同的通行功能. 两种参考模型 OSI 和 TCP/IP, OSI 先有模型后有协议,TCP/IP 则相反. OSI 7层模型 - 应用层 - 表示层 - ...

  4. 小白神器 - 一篇博客学会CSS

    一. 简介 1. css定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表. 属性和属性值用冒号隔开,以分号结尾. 2. 四种引入方式 1.行内式   行内式是在标签 ...

  5. 使用androidstudio 分析内存泄漏

    分析内存泄漏 http://www.jianshu.com/p/c49f778e7acf

  6. 【郑轻邀请赛 G】密室逃脱

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2133 [题意] [题解] 考虑每一个二进制数的最高位->第i位; 肯定是1(这 ...

  7. GROOVY简单语法实习

    慢慢的看<GROOVY IN ACTION>的一个中文节译本,根据上面的东东慢慢练习. 中文看起来确实比英文快好多...:) Book gina = new Book('Groovy in ...

  8. 1393 0和1相等串 51nod

    1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. I ...

  9. C++ primer chapter 12

    动态内存:之前的程序使用对象有着严格定义的生存期,会自动销毁.C++支持动态分配对象,动态分配对象的生存期和他们在哪里创建是无关的,只有当显式的被释放,这些对象才会销毁.标准库定义了智能指针对象可以自 ...

  10. [bzoj1131][POI2008]Sta_树形dp

    Sta bzoj-1131 POI-2008 题目大意:给定一棵n个点的树,求一个根,使得深度和最大. 注释:$1\le n \le 10^6$. 想法:扭一扭即可. 扭的时候看看这个点当没当过根. ...