您的位置:首页 > 运维架构

hdu 5348 MZL's endless loop 欧拉回路

2015-08-05 17:23 183 查看

MZL's endless loop

Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1502 Accepted Submission(s): 331
Special Judge

[align=left]Problem Description[/align]As we all kown, MZL hates the endless loop deeply, and he commands you to solve this problem to end the loop.
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.
[align=left]Input[/align]The first line of the input is a single integer T, 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.
[align=left]Output[/align]For each test case, if there is no solution, print a single line with −1, 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.
[align=left]Sample Input[/align]
2 3 3 1 2 2 3 3 1 7 6 1 2 1 3 1 4 1 5 1 6 1 7

[align=left]Sample Output[/align]
1 1 1 0 1 0 1 0 1

[align=left]Source[/align]2015 Multi-University Training Contest 5

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348

题目大意:将一个无向图构造出一个有向图,要求每个点的入度和出度之差绝对值不超过1。

思路,重点在于删边,边表删边相对于vector存储而言更方便一些,因为.next自带边号,每次把head[],以i为起点的第一条边存储的位置(实际上是最后输入的那条边的边号)改为edge[i].next,即实现了“拆边”。

AC代码:

1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <algorithm>
6 #include <vector>
7 using namespace std;
8 #define MAXN 100010
9 #define MAXM 300010
int t, n, m;
int targ[MAXN][2];
int degree[MAXN], ans[MAXM << 1];
int head[MAXN], edge_cnt;
struct node {
int v, next;
} edge[MAXM << 1];
void init() {
memset(head, -1, sizeof head);
memset(degree, 0, sizeof degree);
memset(targ, 0, sizeof targ);
memset(ans, -1, sizeof ans);
edge_cnt = 0;
}
void add_edge(int u, int v) {
edge[edge_cnt].v = v;
edge[edge_cnt].next = head[u];
head[u] = edge_cnt++;
}
void DFS(int u, int col) {
for(int i = head[u]; ~i; i = edge[i].next) {
if(ans[i] != -1) {
head[u] = edge[i].next;//拆边
continue;
}
int v = edge[i].v;
if(u != v && targ[v][col ^ 1] > targ[v][col]) continue;
ans[i] = col;
ans[i ^ 1] = col ^ 1;
head[u] = edge[i].next;
targ[u][col]++;
targ[v][col ^ 1]++;
DFS(v, col);
break;
}
}
int main() {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
init();
int a, b;
for(int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
add_edge(a, b);
add_edge(b, a);
degree[a]++; degree[b]++;
}
for(int i = 1; i <= n; i++) {
while(targ[i][0] + targ[i][1] < degree[i]) {
if(targ[i][0] < targ[i][1]) DFS(i, 0);
else DFS(i, 1);
}
}
for(int i = 0; i < edge_cnt; i += 2) {
printf("%d\n", ans[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: