图论 HDOJ 5348 MZL's endless loop

题目传送门

 1 /*
 2     题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果
 3     图论:一个图,必定存在偶数个奇度顶点。那么从一个奇度定点深搜,当碰到另外一个奇度顶点时结束,这样能保证度数差<=1 3.5  详细解释:http://blog.csdn.net/ZSGG_ACM/article/details/47287681  
 4 */
 5 /************************************************
 6  * Author        :Running_Time
 7  * Created Time  :2015-8-5 18:55:37
 8  * File Name     :F.cpp
 9  ************************************************/
10 #pragma comment (linker, "/STACK:1024000000,1024000000")
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29
30 #define lson l, mid, rt << 1
31 #define rson mid + 1, r, rt << 1 | 1
32 typedef long long ll;
33 const int MAXN = 1e5 + 10;
34 const int INF = 0x3f3f3f3f;
35 const int MOD = 1e9 + 7;
36 struct Edge {
37     int v, nex, dir;
38 }e[MAXN*6];
39 int head[MAXN];
40 int deg[MAXN];
41 int n, m, tot;
42
43 void init(void) {
44     tot = 0;
45     memset (head, -1, sizeof (head));
46     memset (deg, 0, sizeof (deg));
47 }
48
49 void add_edge(int u, int v) {
50     e[tot].v = v;
51     e[tot].nex = head[u];
52     e[tot].dir = 0;
53     head[u] = tot++;
54 }
55
56 bool DFS(int u) {
57     for (int &i=head[u]; ~i; i=e[i].nex)    {
58         int v = e[i].v;
59         int dir = e[i].dir ^ e[i^1].dir;
60         if (dir)    continue;
61         e[i].dir = 1;
62         if (deg[v]) {
63             deg[v] = 0; return true;
64         }
65         if (DFS (v))    return true;
66     }
67     return false;
68 }
69
70 void work(void) {
71     for (int i=1; i<=n; ++i)    {
72         if (deg[i]) {
73             deg[i] = 0; DFS (i);
74         }
75     }
76     for (int i=1; i<=n; ++i)    {
77         while (~head[i])    DFS (i);
78     }
79     for (int i=0; i<tot; i+=2)  {
80         if (e[i].dir)   puts ("1");
81         else    puts ("0");
82     }
83 }
84
85 int main(void)    {     //HDOJ 5348 MZL‘s endless loop
86     int T;  scanf ("%d", &T);
87     while (T--) {
88         init ();
89         scanf ("%d%d", &n, &m);
90         for (int i=1; i<=m; ++i)    {
91             int u, v;   scanf ("%d%d", &u, &v);
92             deg[u] ^= 1;   deg[v] ^= 1;
93             add_edge (u, v);    add_edge (v, u);
94         }
95         work ();
96     }
97
98     return 0;
99 }

  1 /************************************************
  2  * Author        :Running_Time
  3  * Created Time  :2015-8-5 18:55:37
  4  * File Name     :F.cpp
  5  ************************************************/
  6 #pragma comment (linker, "/STACK:1024000000,1024000000")
  7 #include <cstdio>
  8 #include <algorithm>
  9 #include <iostream>
 10 #include <sstream>
 11 #include <cstring>
 12 #include <cmath>
 13 #include <string>
 14 #include <vector>
 15 #include <queue>
 16 #include <deque>
 17 #include <stack>
 18 #include <list>
 19 #include <map>
 20 #include <set>
 21 #include <bitset>
 22 #include <cstdlib>
 23 #include <ctime>
 24 using namespace std;
 25
 26 #define lson l, mid, rt << 1
 27 #define rson mid + 1, r, rt << 1 | 1
 28 typedef long long ll;
 29 const int MAXN = 1e5 + 10;
 30 const int INF = 0x3f3f3f3f;
 31 const int MOD = 1e9 + 7;
 32 struct Edge {
 33     int v, nex, vis;
 34 }e[MAXN*6];
 35 int head[MAXN];
 36 int deg[MAXN];
 37 int ans[MAXN*6];
 38 int n, m, tot;
 39
 40 void init(void) {
 41     tot = 0;
 42     memset (head, -1, sizeof (head));
 43     memset (deg, 0, sizeof (deg));
 44 }
 45
 46 void add_edge(int u, int v) {
 47     e[tot].v = v;
 48     e[tot].nex = head[u];
 49     e[tot].vis = 0;
 50     head[u] = tot++;
 51 }
 52
 53 void DFS(int u) {
 54     for (int &i=head[u]; ~i; )    {
 55         int v = e[i].v;
 56         if (e[i].vis)   {
 57             i = e[i].nex;   continue;
 58         }
 59         e[i].vis = 1;   e[i^1].vis = 1;
 60         ans[i>>1] = i & 1;
 61         deg[u]--;   deg[v]--;
 62         i = e[i].nex;
 63         DFS (v);
 64     }
 65 }
 66
 67 void patch(void) {
 68     int pre = -1;
 69     for (int i=1; i<=n; ++i)    {
 70         if (deg[i] & 1) {
 71             if (pre == -1)  {
 72                 pre = i;
 73             }
 74             else    {
 75                 add_edge (pre, i);  add_edge (i, pre);
 76                 deg[pre]++; deg[i]++;
 77                 pre = -1;
 78             }
 79         }
 80     }
 81 }
 82
 83 void work(void) {
 84     patch ();
 85     for (int i=1; i<=n; ++i)    {
 86         if (deg[i]) DFS (i);
 87     }
 88     for (int i=0; i<m; ++i)    printf ("%d\n", ans[i]);
 89 }
 90
 91 int main(void)    {
 92     int T;  scanf ("%d", &T);
 93     while (T--) {
 94         init ();
 95         scanf ("%d%d", &n, &m);
 96         for (int i=1; i<=m; ++i)    {
 97             int u, v;   scanf ("%d%d", &u, &v);
 98             deg[u]++;   deg[v]++;
 99             add_edge (u, v);    add_edge (v, u);
100         }
101         work ();
102     }
103
104     return 0;
105 }

不太清楚的代码

图论 HDOJ 5348 MZL's endless loop

时间: 2024-08-10 15:10:26

图论 HDOJ 5348 MZL's endless loop的相关文章

【搜索】HDU 5348 MZL&#39;s endless loop

通道 题意:给出n个点,m条边,现在要给边定向使得点的出度和入度的差不超过1 思路: 对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止,每条边只遍历一次 代码: #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #inclu

HDU 5348 MZL&#39;s endless loop 给边定向(欧拉回路,最大流)

题意:给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 这题本来很简单的事,在每两个奇数度的点添加1条无向边,就变成了个欧拉回路了.欧拉回路的定义时,只要每个点的度为偶数,必定有欧拉回路的存在.只需要选择任1个点出发,遍历每条边仅1次,得到就是欧拉回路路径了,再根据每条边的方向选0/1.添加的那些无向边都是不会影响答案的,因为欧拉回路跑得起来肯定是每个点的出度等于入度,而每个点最多只会被多加1条边,根据题目

HDU 5348 MZL&#39;s endless loop

乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=100000

hdu 5348 MZL&#39;s endless loop 暴搜

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1426    Accepted Submission(s): 319 Special Judge Problem Description As w

hdu 5348 MZL&#39;s endless loop 欧拉回路

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): 331Special Judge Problem Description As we all kown, MZL hates the endless loop deeply, and h

Hdu 5348 MZL&#39;s endless loop (dfs)

题目链接: Hdu 5348 MZL's endless loop 题目描述: 给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)<2.如果能输出任意一种合法方案. 解题思路: 其实仔细考虑一下,每个无向图都会存在合法方案的.证明:度数和为奇数的点只能为起点或者终点,度数为偶数的只能是环上的起点或者终点或者是中间点.有m条边,一共有2*m个端点.所以呢?当然是度数和为奇数的个肯定是偶数个,任意两个相结合都可以形成一条路.并不会有两条

HDU 5348 MZL&#39;s endless loop(思想用的是深搜)经典

MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1343    Accepted Submission(s): 282 Special Judge Problem Description As we all kown, MZL hates the endless loop deeply, and

[2015hdu多校联赛补题]hdu5348 MZL&#39;s endless loop

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1,如果无解输出-1 解:考虑奇数度的点一定会成对出现(因为所有度数和肯定是偶数个->因为一条边产生两度~),那么我们可以将奇数度的点两两一连消除掉(两奇数度点的出度入读差的绝对值都为1, 路径上的点的差绝对值为0) 然后偶数度的点可以成环,那么可以搜出所有的环 1 /* 2 * Problem: 3

HDU5348——DFS——MZL&#39;s endless loop

Problem Description 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