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来说也是错呀. 讲回正题 . ...
随机推荐
- 为什么Java中的密码优先使用 char[] 而不是String?
可以看下壁虎的回答:https://www.zhihu.com/question/36734157 String是常量(即创建之后就无法更改),会保存到常量池中,如果有其他进程可以dump这个进程的内 ...
- [测试工具]----iperf
iperf https://sourceforge.net/projects/iperf/ http://downloads.es.net/pub/iperf/ https://github.com/ ...
- Bequeath Connection and SYS Logon
The following example illustrates how to use the internal_logon and SYSDBA arguments to specify the ...
- STL源码分析之迭代器
前言 迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator-&g ...
- isinstance、issubclass、反射
一.isinstance.issubclass # isinstance(obj, cls) 检查obj是否是cls的对象 class A(object):pass a = A() print(isi ...
- GeoTrust 企业(OV)型 SSL证书
GeoTrust True BusinessID SSL证书属于企业验证(OV)级别的SSL证书,验证域名所有权,验证企业单位信息,提供40位/56位/128位,最高支持256位自适应加密,被20 ...
- 【codeforces 765E】Tree Folding
[题目链接]:http://codeforces.com/problemset/problem/765/E [题意] 给你一棵树; 可以把一个节点的两条相同长度的链合并成一条链; 且这两条相同长度的链 ...
- Jmeter 学习imooc
https://www.imooc.com/video/14718 1. BS Vs CS BS架构: browser server CS架构: Client server(安装到本地)
- web项目log日志查看分析->流程理解
1.DEBUG [2017-07-10 11:38:41,705][] org.springframework.web.servlet.DispatcherServlet:865 - Dispatch ...
- 你还在苦逼地findViewById吗?使用ButterKnife从此轻松定义控件
前段时间笔者在苦逼地撸代码~最后发现有些复杂的界面在写了一屏幕的findviewbyid~~~另一堆setOnXXXListener~有没有方便一点的方法让我们简单点不用每次都定义一次.find一次, ...