hdu5348(2015多校5)--MZL's endless loop(搜索)

题目链接:点击打开链接

题目大意:给出n个点,m条无向边,现在要求将无向边变为有向边,要保证每个点的出度和入度的差不超过1

直接进行搜索,对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止。

注意:

1、已经使用过的边为了防止再次被遍历,可以修改head,head[u] = edge[i].next

2、注意自环,因为搜索是判断能不能继续向下搜索时,使用了v的入度和出度比较,那么如果是自环可能会被判断不能被加上。

证明不会有-1的情况,对于一个点v,假设入度比出度多2,那么,第一:就会有一条边搜索到v后找不到后继,导致v的入度比出度多1,第二:又有一条边搜索到v,导致v的入度比出度多2,但是这样的话就会和第一条找不到后继冲突,所以不会出现入度比出度多2的情况,(其他情况也是类似),所以不会有-1的结果。

#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <cmath>
#include <map>
#include <stack>
#include <algorithm>
using namespace std ;
#pragma comment(linker, "/STACK:102400000,102400000")
#define LL __int64
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int mod = 1e9+7 ;
const double eqs = 1e-9 ;
struct node{
    int u , v , id ;
    int next ;
}edge[700000];
int head[100010] , cnt , vis[700000] ;
int in[100010] , out[100010] , num[100010] ;
int ans[700000] , n ;
void add(int u,int v,int id) {
    edge[cnt].u = u ; edge[cnt].v = v ;
    edge[cnt].id = id ;
    edge[cnt].next = head[u] ; head[u] = cnt++ ;
}
void dfs1(int u) {
    int i , v ;
    for(i = head[u] ; i != -1 ; i = edge[i].next ) {
        if( vis[i] ) {
            head[u] = edge[i].next ;
            continue ;
        }
        v = edge[i].v ;
        if( u != v && in[v] > out[v] ) continue ;
        vis[i] = vis[i^1] = 1 ;
        if( i%2 ) 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) {
    int i , v ;
    for(i = head[u] ; i != -1 ; i = edge[i].next) {
        if( vis[i] ) {
            head[u] = edge[i].next ;
            continue ;
        }
        v = edge[i].v ;
        if( u != v && out[v] > in[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 , m ;
    int i , j , u , v ;
    scanf("%d", &t) ;
    while( t-- ) {
        scanf("%d %d", &n, &m) ;
        cnt = 0 ;
        for(i = 1 ; i <= n ; i++) {
            head[i] = -1 ;
            in[i] = out[i] = num[i] = 0 ;
        }
        for(i = 0 ; i <= 2*m ; i++)
            vis[i] = 0 ;
        for(i = 0 ; i < m ; i++) {
            scanf("%d %d", &u, &v) ;
            add(u,v,i) ;
            add(v,u,i) ;
            num[u]++ ;
            num[v]++ ;
        }
        for(i = 1 ; i <= n ; i++) {
            while( in[i] + out[i] < num[i] ) {
                if( in[i] >= out[i] )
                    dfs1(i) ;
                else
                    dfs2(i) ;
            }
        }
        for(i = 0 ; i < m ; i++) {
            printf("%d\n", ans[i]) ;
        }

    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu5348(2015多校5)--MZL's endless loop(搜索)

时间: 2024-12-09 22:04:50

hdu5348(2015多校5)--MZL's endless loop(搜索)的相关文章

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

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

2015多校.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): 898    Accepted Submission(s): 178Special Judge Problem Description As we all kown, MZL hates the endless loop deeply, and he

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

hdu5348 MZL&#39;s endless loop(欧拉回路)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1705    Accepted Submission(s): 369Special Judge Problem Descripti

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

HDU 5349(2015多校5)-MZL&#39;s simple problem(优先队列)

题目地址:HDU 5349 很水的优先队列就能搞好,只不过注意如果2操作结束后的队列为空,那么Max的值为-inf. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set&

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): 751    Accepted Submission(s): 138 Special Judge Problem Description As we all kown, MZL hates the endless loop deeply, and

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