2015 多校联赛 ——HDU5348(搜索)
You are given an undirected graph with n vertexs
and m edges.
Please direct all the edges so that for every vertex in the graph the inequation |out degree − in degree|≤1 is
satisified.
The graph you are given maybe contains self loops or multiple edges.
indicating the number of testcases.
For each test case, the first line contains two integers n and m.
And the next m lines,
each line contains two integers ui and vi,
which describe an edge of the graph.
T≤100, 1≤n≤105, 1≤m≤3∗105, ∑n≤2∗105, ∑m≤7∗105.
otherwise output m lines,.
In ith
line contains a integer 1 or 0, 1 for
direct the ith
edge to ui→vi, 0 for ui←vi.
3 3
1 2
2 3
3 1
7 6
1 2
1 3
1 4
1 5
1 6
1 7
1
1
0
1
0
1
0
1
题:给出n个点,m条无向边,现在要求将无向边变为有向边,要保证每个点的出度和入度的差不超过1
思路来自:http://blog.csdn.net/winddreams/article/details/47281397
直接进行搜索,对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止。
对于已经判断过的边删去:head[u] = edge[i].next;
证明不会有-1的情况,对于一个点v,假设入度比出度多2,那么,第一:就会有一条边搜索到v后找不到后继,导致v的入度比出度多1,第二:又有一条边搜索到v,导致v的入度比出度多2,但是这样的话就会和第一条找不到后继冲突,所以不会出现入度比出度多2的情况,(其他情况也是类似),所以不会有-1的结果。
(果然稍难一点自己就不知道怎么办了 好坑orz)
#include <iostream>
#include <cstdio>
#include<algorithm>
#include<cstring>
#include<functional>
#include<queue>
typedef long long ll;
using namespace std; struct node
{
int u,v,ci;
int next;
} edge[700000];
int n,m,to;
int head[100010] , vis[700000] ;
int in[100010] , out[100010] , num[100010] ;
int ans[700000] ; void add(int u,int v,int c)
{
edge[to].u= u;
edge[to].v= v;
edge[to].ci = c;
edge[to].next = head[u];
head[u] = to++;
} void dfs1(int u) //正向搜索
{
for(int i = head[u]; ~i; i = edge[i].next)
{
if(vis[i])
{
head[u] = edge[i].next; //删边
continue;
}
int v = edge[i].v;
if(u != v && in[v] > out[v]) //u->v,in[v] > out[v]时,跳过
continue;
vis[i] = vis[i^1] = 1; //将u,v之间的两条边标记
if(i %2) //有输入可知,i为偶时u->v; i为奇时,v->u
ans[i/2] = 0;
else
ans[i/2] = 1;
out[u]++;
in[v]++;
head[u] = edge[i].next;
dfs1(v);
break;
}
} void dfs2(int u)
{
for(int i = head[u]; ~i; i = edge[i].next)
{
if(vis[i])
{
head[u] = edge[i].next;
continue;
}
int v = edge[i].v;
if(u != v && in[v] < out[v])
continue;
vis[i] = vis[i^1] = 1;
if(i %2)
ans[i/2] = 1;
else
ans[i/2] = 0;
out[v]++;
in[u]++;
head[u] = edge[i].next;
dfs2(v);
break;
}
} int main()
{
int T;
int a, b;
scanf("%d",&T);
while(T--)
{
to = 0;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i = 0;i <= n;i++)
{
in[i] = out[i] = num[i] = 0;head[i] = -1;
}
for(int i = 0; i < m; i++)
{
scanf("%d%d",&a,&b);
add(a,b,i);
add(b,a,i);
num[a]++;
num[b]++;
} for(int i = 1; i <= n; i++)
{
while(in[i] + out[i] < num[i])
{
if(in[i] >= out[i]) //正反不停搜,直到找不到边为止
dfs1(i);
else
dfs2(i);
}
}
for(int i = 0; i < m; i++)
printf("%d\n",ans[i]);
}
return 0;
}
2015 多校联赛 ——HDU5348(搜索)的更多相关文章
- 2015 多校联赛 ——HDU5323(搜索)
Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 2015 多校联赛 ——HDU5305(搜索)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- 2015 多校联赛 ——HDU5334(构造)
Virtual Participation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- 2015 多校联赛 ——HDU5335(Walk out)
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S ...
- 2015 多校联赛 ——HDU5302(构造)
Connect the Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 2015 多校联赛 ——HDU5294(最短路,最小切割)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 2015 多校联赛 ——HDU5325(DFS)
Crazy Bobo Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Tota ...
- 2015 多校联赛 ——HDU5316(线段树)
Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an ...
- 2015 多校联赛 ——HDU5319(模拟)
Painter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
随机推荐
- Java课程设计报告——购物车
1.码云GIT提交 Git地址 2基本框架 3.基本界面 1.主界面: 2.购物车界面: 3.添加商品界面: 4.删除商品界面: 5.修改商品界面: 6.商城界面: 7.购物车显示界面: 4.代码解释 ...
- 北亚关于HP EVA4400/6400/8400/P6000的数据恢复解决方案
[引言]本文档建立在针对HP EVA的大量测试性研究基础上,所有的细节几乎均为对EVA的破译型研究,目前全球范围内尚未发现类似资料,故可能表述方式和结论并不精确,仅为参考之用.我们公司为研究HP EV ...
- 通过URL传递PDF名称参数显示PDF
1 <%@ page language="java" import="java.util.*,java.io.*" 2 pageEncoding=&quo ...
- 解决忽略VScode中Python插件pylint报错的问题
pylint是VScode中python自带的插件,可以帮助代码规范,美观. 但是有些报错是你不想看到的,你可以选择性的忽略. 例如,在re.compile()中,可以添加参数re.S使. 匹配任意字 ...
- LeetCode题型分类及索引
目录 这是一个对LeetCode题目归类的索引,分类标准参考了July大神的<编程之法>以及LeetCode的tag项.分类可能还不太合理,逐步完善,请见谅~ 题主本人也在一点一点的刷题, ...
- js实现图片(高度不确定)懒加载
最近一直在弄广告页,由于广告页几乎都是图片拼凑起来的,为了减少服务器压力和带宽,采用图片懒加载方式,但是我们的图片高度又不确定,所以我在网上下载了echo.js自己改了一下. 大体思路是:让首页先加载 ...
- aws - shadow 影子使用
参考链接: https://github.com/aws/aws-iot-device-sdk-java 一.设备注册 二.设备主题
- 图数据库orientDB(1-2)例子
http://gog.orientdb.com/index.html#/infotab 小朱25岁,出生在教师家庭并且有个姐姐小田,他现在奋斗在帝都. 那么SQL是这样滴!!! CREATE VER ...
- 微信小程序授权获取用户详细信息openid
小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...
- 访问器属性:setter()函数和getter()函数
1.干嘛用的? getter()函数:返回有效的值 setter()函数:调用它并传入数据,这个函数决定如何处理数据 2.具备哪些属性?如何定义? configurable(默认为true),enum ...