The Best Path---hdu5883(欧拉路径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883

题意:n 个点 条无向边的图,找一个欧拉通路/回路使得这个路径所有结点的异或值最大。

先判断是否含有欧拉路径,如果存在的话有两种情况,有起点和终点不同的欧拉路径,这样我们只需把经过奇数次的点的权值异或起来即可;

还有就是起点和终点相同的欧拉回路;我们在原来的基础上枚举出一个起点,使得结果最大即可;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 100005
#define INF 0x3f3f3f3f
typedef long long LL;

int du[N], n, a[N];

int Judge()
{
    int odd = 0, ans = 0;
    for(int i=1; i<=n; i++)
    {
        if(du[i]&1)
            odd++;
    }

    if(odd !=0 && odd != 2)///度数为奇数的点只有是这两种情况下才存在欧拉路径;
        return -1;

    for(int i=1; i<=n; i++)
    {
        du[i] = (du[i]+1)/2;///经过一个点的次数;
        if(du[i]&1)///当经过偶数次时异或结果为0,所以只需异或奇数即可;
            ans ^= a[i];
    }
    if(odd == 0)///当度数都为偶数时,说明存在欧拉回路,我们只需枚举起点,保存最大值即可;
    {
        for(int i=1; i<=n; i++)
            ans = max(ans, ans^a[i]);
    }
    return ans;
}

int main()
{
    int T, m;
    scanf("%d", &T);
    while(T--)
    {
        met(du, 0);

        scanf("%d %d", &n, &m);

        for(int i=1; i<=n; i++)
            scanf("%d", &a[i]);

        for(int i=1; i<=m; i++)
        {
            int u, v;
            scanf("%d %d", &u, &v);
            du[u] ++; du[v] ++;
        }

        int ans = Judge();

        if(ans == -1) puts("Impossible");
        else printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-12-12 23:42:26

The Best Path---hdu5883(欧拉路径)的相关文章

HDU5883 The Best Path(欧拉回路 | 通路下求XOR的最大值)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 思路: 先判断原图是否是欧拉回路或者欧拉通路.是的话如果一个点的度数除以2是奇数则可以产生一个XOR贡献值.之后如果是欧拉通路, 则答案是固定的,起点和终点需要多产生一次贡献值. 如果是欧拉回路, 则需要枚举起点. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #inclu

HDU5883 The Best Path(并查集+欧拉路)

题意: n个点m条边,问m条边构成的是否为欧拉路. 是的话输出路径上所有点的异或和,每个点经过几次异或几次. 思路: 先用并查集判断是否连通,然后如果是欧拉路的话有两种情况 如果奇数度节点有2个,就枚举这两个点做起点,选大的 如果都为偶数度节点,就枚举n个起点,选大的 /* *********************************************** Author :devil ************************************************ *

hdu5883:The Best Path 欧拉图的性质和应用

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 题目大意: 给定 n 个点, m 条边的图,每个点有权值,求所给图是否是欧拉图, 如果是, 求出所经过点的权值做异或运算的最大值. 吐槽:这题给的数据竟然不用判断是否联通,坑了我几发MLE,不过也骗过啦 题目思路:首先异或运算满足交换律,所以与点的遍历顺序无关. 其次,对于欧拉图的判定,奇数度的结点个数为0是欧拉回路,为2是欧拉通路. 然后,没经过一个点,该点的度数减去2,所以可以判断出一个点

这回一定要把欧拉路径搞清楚

欧拉路径的存在条件 有限图 G 是链或圈的充要条件是:G为连通图,且其中奇顶点的数目等于0或者2.有限连通图 G 是圈当且仅当它没有奇顶点. 链就是存在欧拉路径,圈就是存在欧拉回路. 这个都比较好判断   再插一下什么是割边 割边就是一条边,去掉他之后整个图由连通变成不连通了.就像桥一样. 下面来求一下欧拉路径 据说是用弗洛莱算法. #include <cstdlib> #include <cstring> #include <cstdio> #include <

nyoj 单词拼接(并查集判断连通性+欧拉路径)

这题还是比较难的. 首先建图方面,如果单纯的把单词作为点,能拼接的关系作为边,那么就是哈密顿图(每个点仅能走一次),难度比较大. 换一种思路,就是把每个单词看成一条有向边,由该单词的首字母指向尾字母. 那么这题便是欧拉图的问题了. 本质上采用的还是搜索,但是为了快速得到字典序最小的欧拉路径,首先要对单词集进行排序. 排完序后,用边集数组存图:再通过计算各点的出度与入度,同时判断基图(不考虑边的方向的图)的连通性,判断是否存在欧拉回路或欧拉通路. 如果存在欧拉回路,那么就从0开始搜索: 如果存在欧

hiho欧拉路&#183;二 ----- Fleury算法求欧拉路径

hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小Hi快来帮帮我! 小Hi:好了,好了.让我们一起来解决这个问题. <小Hi思考了一下> 小Hi:原来是这样...小Ho你仔细观察这个例子: 因为相连的两个数字总是相同的,不妨我们只写一次,那么这个例子可以写成:3-2-4-3-5-1.6个数字刚好有5个间隙,每个间隙两边的数字由

poj2337 欧拉路径

poj2337 这道题昨天晚上开始做,今天才A.但是问题想透了, 发现其实没那么难 题目大意: 给你一些单词,如果一个单词的末尾字符与另一个单词首字符相同,则两个的单词可以连接.问是否可以把所有单词连接起来,并且每个单词只能用一次. 分析: 可以把每个单词看成是一条边,单词的首尾字符看做是两个相连的点.我们可以把它看成有向图的欧拉路径问题(欧拉路径,欧拉回路不太明白的自己百度吧). 一个有向图含有欧拉通路,首先图是连通的,并且当且仅当该图所有顶点的入度 =出度, 或者起始顶点入度 = 出度 -

两个欧拉路径的例题

#include<iostream> #include<stdio.h> #include<string.h> #include<vector> using namespace std; int n,m,a,b; int degree[1005]; int vis[1005]={0}; vector<int> vec[1005]; int get=0; void dfs(int st) { vis[st]=1; get++; for(int i=

hihoCoder#1181(欧拉路径)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. ——By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现主角恰好拥有M快骨牌. 小H

hihoCoder - 1181 - 欧拉路&#183;二 (Fleury算法求欧拉路径)

#1181 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. --By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现