图论 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
", 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 }
不太清楚的代码
编译人生,运行世界!
原文地址:https://www.cnblogs.com/Running-Time/p/4705874.html