HDU5348

题意:给一个无向图,让你指定边的方向,比如a→b为1,a←b为0,在给所有边指定方向后,对无向图上的每个顶点,如果满足|出度-入度|<2,那么输出一种方案。

思路:从结论入手,|出度-入度|<2,那么只能为0或1,对于0的情况,应该是出度等于入度,所以每个顶点都有偶数个度,既偶数条边,如果为1的话,一定是奇数条边,所以对于第二种情况,因为奇数边的点要么是起点,要么是终点(搜索),我们先对奇数边的点dfs,然后更改奇数边点的度数(删边),使之全部为偶数边,用line来存储相关联的两条边,index存储边的下标,value存储边的方向,total存放点的总度数。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#define MAX 500050
using namespace std;

vector<int> line[MAX],index[MAX],value[MAX];
int total[MAX],flag[MAX],ans[MAX];
int t,n,m;

void init ()
{
    for ( int i = 0 ; i <= n ; i++ )
    {
        line[i].clear();
        index[i].clear();
        value[i].clear();
    }
    memset ( total , 0 , sizeof ( total ));
    memset ( flag , 0 , sizeof ( flag ));
}

void dfs ( int u )
{
    int len = line[u].size()-1;
    for ( int i = len ; i >= 0; i-- )
    {
        int v = line[u][i];
        int x = index[u][i];
        int c = value[u][i];
        line[u].pop_back();
        if ( flag[x] ) continue;
        total[u]--;
        total[v]--;
        ans[x] = c;
        flag[x] = 1;
        dfs ( v );
        break;
    }
}

void solve()
{
    for ( int u=1 ; u<=n;u++ )
        if (total[u]&1)
            dfs(u);
    for (int u=1;u<=n;u++)
        dfs(u);
    for (int i=0;i<m;i++ )
        printf("%d\n",ans[i]);
}

int main ( )
{
    scanf ( "%d" , &t );
    while ( t-- )
    {
        scanf ("%d%d" , &n , &m );
        init();
        for ( int i = 0 ; i < m ; i++ )
        {
            int u,v;
            scanf ( "%d%d" , &u , &v );
            line[u].push_back ( v );
            index[u].push_back ( i );
            value[u].push_back ( 1 );
            line[v].push_back ( u );
            index[v].push_back ( i );
            value[v].push_back ( 0 );
            total[u]++;
            total[v]++;
        }
        solve();
    }
}

版权声明:转载请注明出处

时间: 2024-10-16 22:52:16

HDU5348的相关文章

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

hdu5348(2015多校5)--MZL&#39;s endless loop(搜索)

题目链接:点击打开链接 题目大意:给出n个点,m条无向边,现在要求将无向边变为有向边,要保证每个点的出度和入度的差不超过1 直接进行搜索,对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止. 注意: 1.已经使用过的边为了防止再次被遍历,可以修改head,head[u] = edge[i].next 2.注意自环,因为搜索是判断能不能继续向

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

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

补题目录!

补补补!虽然感觉这目录会越来越长! 目录如下: 多校1: 1012/hdu5299(博弈).1009/hdu5296(数链剖分/其他).1006/hdu5293(不造) 多校2: 1004/hdu5303(贪心还是DP来的) 多校3: 1008/hdu5323(规律+模拟吧).1003/hdu5318(不造).1009/hdu5324(不造) 多校4: 1012/hdu5338(贪心+线段树之类的吧) 多校5: 1006/hdu5348.1010/hdu5352 (这场因为身体不舒服并没有打)