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来说也是错呀. 讲回正题 . ...
随机推荐
- centos vm 桥接 --网络配置
/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 HWADDR= ...
- BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天...... Code: #include<bits/stdc++.h> #define maxn 200010 #define ll long long using nam ...
- vue中的父组件及子组件生命周期的执行顺序
一.没有任何任何显示与隐藏限制条件的情况下: 1.运行的顺序依次是: 父组件created→父组件beforeMounted→子组件created→子组件beforeMounted→子组件mounte ...
- 29. 误拼写时的fuzzy模糊搜索技术
搜索的时候,可能输入的搜索文本会出现误拼写的情况,这时就需要es为我们进行智能纠错 比如有两个文档: doc1: hello world doc2: hello java 现在要搜索:hall ...
- router-link/ router-view 的使用
遇到的问题如下: 在菜单栏使用router-link配置菜单连接地址,使用router-view 显示连接地址的详细内容 首次配置的时候,使用router-link 配置好菜单之后,不知道如何使用ro ...
- 【Codeforces 429B】Working out
[链接] 我是链接,点我呀:) [题意] 两个人,一个人在左上角,一个人在左下角. 左上角要到右下角去 左下角要到右上角去 只能走到相邻的格子(不能往回走,即一个往右下,一个往右上走) 要求这两个人必 ...
- BUPT2017 wintertraining(15) #9
下面不再说明题意了请自行读题,直接放contest链接. https://vjudge.net/contest/151607 A.考虑当火车隔k站一停时 区间长度 >= k 的纪念品一定能买到 ...
- Codeforces Round #412 (Div. 2)ABCD
tourist的剧毒contest,题干长到让人不想做... A.看不太懂题意直接看下面input output note n组里有两数不一样的一组就rated 否则单调不增为maybe,否则unra ...
- Boolean Expressions
Boolean Expressions Time Limit: 1000MS Memory Limit: 30000K Description The objective of the ...
- [bzoj3676]回文串[后缀数组+Manacher]
后缀数组+Manacher #include <iostream> #include <cstdio> #include <cstdlib> #include &l ...