题目链接: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. CAD在网页中增加一个射线

    主要用到函数说明: IMxDrawBlockTableRecord::AddRay 向记录中增加一个射线,详细说明如下: 参数 说明 point1 射线上的点1 point2 射线上的点2 js代码实 ...

  2. 计蒜客 成绩统计 (Hash表)

    链接 : Here! 思路 : 如果用 $STL$ 的 $map$ 或者是使用 $unordered\underline{}map$ 的话是会 $T$ 的, 所以得手写一个 $hash表$. 其实这个 ...

  3. lua_note_01_lua介绍

    1. lua 1. lua 1.1. lua介绍 1.2. Lua 特性 1.3. 特点 1.4. Lua 应用场景 1.5. 环境搭建 1.6. VS lua 1.1. lua介绍 Lua 是一种轻 ...

  4. [luogu2594 ZJOI2009]染色游戏(博弈论)

    传送门 Solution 对于硬币问题,结论是:当前局面的SG值等于所有背面朝上的单个硬币SG值的异或和 对于求单个背面朝上的硬币SG值...打表找规律吧 Code //By Menteur_Hxy ...

  5. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  6. 新浪微博API生成短链接

    通过新浪微博API,生成短链接,支持一次性转多个长链接 什么是短链接 短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串. 短链接服务 国内各大微博都推出了自己的短链接 ...

  7. Matplotlib基础知识

    Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis水平和垂直的轴线 x轴和y轴刻度 tick刻度标示坐标轴的分隔,包括最小刻度和最大刻度 x轴和y轴刻度标签 ...

  8. (转)window.location.hash 属性使用说明

    location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...

  9. Django——3 模板路径 模板变量 常用过滤器 静态文件的使用

    Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创 ...

  10. hdu_1020_Encoding_201310172120

    Encoding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...