2015 多校赛 第五场 1006 (hdu 5348)
题目链接: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)的更多相关文章
- 2015 多校赛 第五场 1010 (hdu 5352)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 看题看得心好累. 题目大意: 给出 n 个点,依次执行 m 次操作:输入“1 x”时,表示将与 ...
- 2015 多校赛 第七场 1011 (hdu 5379)
题意:给定一棵树,树上有 n 个节点.问有多少种方案,使得在每个节点上依次放置数 1~n 后,每个节点的儿子节点上的数连续(比如 1 为根,有1-2,1-3,1-4,则令2,3,4上的数连续),每个子 ...
- 2015 多校赛 第四场 1010 (hdu 5336)
Problem Description XYZ is playing an interesting game called "drops". It is played on a r ...
- 2015 多校赛 第四场 1009 (hdu 5335)
Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit) ...
- 2015 多校赛 第三场 1002 (hdu 5317)
Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more i ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- hdu5379||2015多校联合第7场1011 树形统计
pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...
- 2015 GDUT校赛
周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . ...
随机推荐
- CAD在网页中增加一个射线
主要用到函数说明: IMxDrawBlockTableRecord::AddRay 向记录中增加一个射线,详细说明如下: 参数 说明 point1 射线上的点1 point2 射线上的点2 js代码实 ...
- 计蒜客 成绩统计 (Hash表)
链接 : Here! 思路 : 如果用 $STL$ 的 $map$ 或者是使用 $unordered\underline{}map$ 的话是会 $T$ 的, 所以得手写一个 $hash表$. 其实这个 ...
- 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 是一种轻 ...
- [luogu2594 ZJOI2009]染色游戏(博弈论)
传送门 Solution 对于硬币问题,结论是:当前局面的SG值等于所有背面朝上的单个硬币SG值的异或和 对于求单个背面朝上的硬币SG值...打表找规律吧 Code //By Menteur_Hxy ...
- TCP/IP UDP 协议首部及数据进入协议栈封装的过程
数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...
- 新浪微博API生成短链接
通过新浪微博API,生成短链接,支持一次性转多个长链接 什么是短链接 短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串. 短链接服务 国内各大微博都推出了自己的短链接 ...
- Matplotlib基础知识
Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis水平和垂直的轴线 x轴和y轴刻度 tick刻度标示坐标轴的分隔,包括最小刻度和最大刻度 x轴和y轴刻度标签 ...
- (转)window.location.hash 属性使用说明
location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...
- Django——3 模板路径 模板变量 常用过滤器 静态文件的使用
Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创 ...
- hdu_1020_Encoding_201310172120
Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...