hdu 5833(欧拉路)

The Best Path

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 18    Accepted Submission(s): 8

Problem Description

Alice is planning her travel route in a beautiful valley. In this valley, there are N lakes, and M
rivers linking these lakes. Alice wants to start her trip from one
lake, and enjoys the landscape by boat. That means she need to set up a
path which go through every river exactly once. In addition, Alice has a
specific number (a1,a2,...,an) for each lake. If the path she finds is P0→P1→...→Pt, the lucky number of this trip would be aP0XORaP1XOR...XORaPt. She want to make this number as large as possible. Can you help her?

Input

The first line of input contains an integer t, the number of test cases. t test cases follow.

For each test case, in the first line there are two positive integers N (N≤100000) and M (M≤500000), as described above. The i-th line of the next N lines contains an integer ai(∀i,0≤ai≤10000) representing the number of the i-th lake.

The i-th line of the next M lines contains two integers ui and vi representing the i-th river between the ui-th lake and vi-th lake. It is possible that ui=vi.

Output

For each test cases, output the largest lucky number. If it dose not have any path, output "Impossible".

Sample Input

2
3 2
3
4
5
1 2
2 3
4 3
1
2
3
4
1 2
2 3
2 4

Sample Output

2
Impossible

Source

2016 ACM/ICPC Asia Regional Qingdao Online

题意:有 n个湖泊m条河流,现在 Alice 要从某点出发走遍所有河流一次且仅一次,问Alice走过的点的异或最大值是多少?

题解:这题每条边要走且仅走一次,那么这明显就是个欧拉(回)路,先判断一下连通分量的个数,如果有多个就是 "Impossible",然后判断度为奇数的点的个数 ,如果不是0个或者2个,输出"Impossbie" ,如果度为奇数个数为 0 个,那么就是欧拉回路,那么就从度不为0且degree/2为奇数的每个点做异或,得到一个结果,得到的结果然后分别与每个点做异或,选择最大的.如果度为奇数的点是 2 个,那么每个点走的次数便是确定的,如果是度是偶数,那么degree/2为奇数的点参与异或,如果度为奇数,那么当(degree+1)/2为奇数时,此点参与异或。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100005;
int a[N];
int father[N];
int degree[N];
int _find(int x)
{
    if(x!=father[x]) father[x] = _find(father[x]);
    return father[x];
}
void Union(int a,int b)
{
    int x = _find(a);
    int y = _find(b);
    if(x==y) return ;
    father[x] = y;
}
void init(int n)
{
    for(int i=1; i<=n; i++)
    {
        father[i] = i;
        degree[i] = 0;
    }
}
int main()
{
    int tcase,n,m;
    scanf("%d",&tcase);
    while(tcase--)
    {
        scanf("%d%d",&n,&m);
        init(n);
        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);
            degree[u]++;
            degree[v]++;
            Union(u,v);
        }
        int ans = 0;
        for(int i=1; i<=n; i++)
        {
            if(degree[i]>0)
            {
                if(_find(i)==i) ans++;
            }
        }
        ///连通分量个数
        if(ans>1)
        {
            printf("Impossible\n");
            continue;
        }
        ans = 0;
        for(int i=1; i<=n; i++)
        {
            if(degree[i]%2!=0) ans++;
        }
        ///判断是否为欧拉路
        if(ans!=0&&ans!=2)
        {
            printf("Impossible\n");
            continue;
        }
        LL res = 0;
        if(ans==0)
        {
            for(int i=1; i<=n; i++)
            {
                int K = degree[i]/2;
                if(degree[i]!=0&&K%2==1){
                    res = res^a[i];
                }
            }
            LL MAX = -1;
            for(int i=1; i<=n; i++)
            {
                int K = degree[i]/2;
                if(degree[i]!=0){
                    MAX = max(MAX,res^a[i]);
                }
            }
            res = MAX;
        }
        else
        {
            for(int i=1; i<=n; i++)
            {
                int K = degree[i]/2;
                if(degree[i]%2==0&&K%2==1)
                {
                    res = res^a[i];
                }
                if(degree[i]%2==1)
                {
                    K = (degree[i]+1)/2;
                    if(K%2==1)
                        res = res^a[i];
                }
            }
        }
        printf("%lld\n",res);
    }
    return 0;
}
时间: 2024-08-10 17:02:54

hdu 5833(欧拉路)的相关文章

HDU 5883 The Best Path (欧拉路或者欧拉回路)

题意: n 个点 m 条无向边的图,找一个欧拉通路/回路使得这个路径所有结点的异或值最大. 析:由欧拉路性质,奇度点数量为0或2.一个节点被进一次出一次,度减2,产生一次贡献,因此节点 i 的贡献为 i 点的度数除以2然后再模22??degree?u????⌋ mod 2)∗a?u??.欧拉回路的起点贡献多一次, 欧拉通路的起点和终点贡献也多一次.因此如果是欧拉回路的话枚举一下起点就好了. 但是这个题有坑,就是有孤立点,这些点可以不连通,....被坑死了,就是这一点,到最后也没过...伤心 代码

HDU 1878.欧拉回路【欧拉路及欧拉回路初接触】【8月2】

欧拉回路 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结 束. Output 每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0.

hdu 5883(欧拉路)

这道题实际上是一道判断是否含有欧拉路的题,欧拉路是经过所有的边有且一次,分为欧拉通路和欧拉回路, 首先我以为要先判断一下该无向图是否是通路(可以用dfs或bfs遍历一遍),但是后来发现不用判断,题目已经说明其是通路, 这就好做多了,首先分析每个点的度,如果奇数度顶点为2个,则为欧拉通路,且起点和终点分别是这两个奇数度顶点,这时我们发现求其路径中经过顶点的异或时(异或满足交换律), 就是每个顶点需要异或自己的值度/2次(异或自己偶数次相当于没异或,奇数次相当于异或自己一次),其中起点和终点都需要加

HDU 3018 Ant Trip (欧拉路的个数 并查集)

Ant Trip Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5501    Accepted Submission(s): 2146 Problem Description Ant Country consist of N towns.There are M roads connecting the towns. Ant Tony,

欧拉路&amp;&amp;欧拉回路 概念及其练习

欧拉路: 如果给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,这条路称为欧拉路: 如果给定无孤立结点图G,若存在一条回路,经过图中每边一次且仅一次,那么该回路称为欧拉回路. 存在欧拉回路的图,称为欧拉图. 一. 对于无向图G,具有一条欧拉路,当且仅当G是连通的,且有零个或两个奇数度结点. 且有零个奇数度结点,存在欧拉回路:有两个奇数度结点,存在欧拉路. 判断无向图G是否连通,可以从任意结点出发,进行深度优先遍历,如果可以遍历到所有点,也可以用并查集,判断根节点的个数, 说明,图G连通

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs

今天学了一下欧拉路

欧拉路径是指能从一个点出发能够“一笔画”完整张图的路径: 在无向图中:如果每个点的度都为偶数 那么这个图是欧拉回路:如果最多有2个奇数点,那么出发点和到达点必定为该2点,那么这个路径就为欧拉路:(前提都是该图连通) 在有向图中:如果每个店的出度和入度都相同,那么为欧拉回路:如果最多只能有2个点的出度不等于入度,并且其中一个点的 入度=出度+1,另一点的 入度+1=出度,那么为欧拉路:(前提图连通) hdu 1116 //因为字符从第一个到最后一个,所以用有向图#include<stdio.h>

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

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

CCF 201512-4 送货 (并查集+DFS,欧拉路)

问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道.然而,F公司现在只安排了小明一个人负责所有街道的服务. 任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案.城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的 首尾都正好连接着一个交叉路口.除开街道的首尾端点,街道不会在其他位置与其他街道相交.每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一 条或两