zoukankan      html  css  js  c++  java
  • 图论 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 }
    不太清楚的代码
    编译人生,运行世界!
  • 相关阅读:
    Linux常用命令大全详解
    C++语言关键字及注解
    求两数的最大公约数
    ICOP完成端口详解
    C/C++常见面试题
    猴子吃桃问题之《C语言经典案例分析》
    DTD
    DTD
    DTD的使用
    Rust
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4705874.html
Copyright © 2011-2022 走看看