# HDU-5883-The Best Path【2016青岛】【欧拉路】

## 5883-The Best Path

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

``````在无向图中，
欧拉通路：两个点度数为奇数，其余点度数为偶数
欧拉回路：所有点度数为偶数
``````

1.欧拉回路

2.欧拉通路

1. 由于要经过的是每条河而不是每一个湖，所以，只需要判断有河经过的湖是不是联通。
2. 存在河u – > v（u == v） 这些点也要处理，由于可能存在这些点是孤立的，但是也要经过。这里wa了好久

```#include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <cmath> #include <cstdio> #include <cstring> #include <cctype> #include <algorithm> #include <functional> #include <numeric> #include <string> #include <set> #include <map> #include <stack> #include <vector> #include <queue> #include <deque> #include <list> using namespace std; #define LL long long ```

```int a[100005]; int d[100005]; int cc[100005]; #define MAXN 100005 int fa[MAXN] = {0}; int ranks[MAXN] = {0}; void initialise(int n) //初始化 { for (int i = 1; i <= n; i++) fa[i] = i,ranks[i] = 1; } int getfather(int v) //父节点 { return (fa[v] == v) ? v : fa[v] = getfather(fa[v]); } void merge(int x,int y) //合并 { x = getfather(x); y = getfather(y); if (x != y) fa[x] = y,ranks[y] += ranks[x]; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); memset(d,0,sizeof(d)); memset(cc,0,sizeof(cc)); for (int i = 1; i <= n; i++) { scanf("%d",&a[i]); } initialise(n); for (int i = 0; i < m; i++) { int u,v; scanf("%d%d",&u,&v); cc[u] = 1; cc[v] = 1; d[u]++; d[v]++; merge(u,v); } int cnt = 0; for (int i = 1; i <= n; i++) { if (fa[i] == i && cc[i]) { cnt++; } } if (cnt != 1) { printf("Impossible\n"); continue; } cnt = 0; long long ans = 0; for (int i = 1; i <= n; i++) { if (d[i] % 2 == 0) { int kk = d[i] / 2; if(kk % 2) { ans ^= a[i]; } } else { if (((d[i] + 1) / 2) % 2) ans ^= a[i]; cnt++; } } if(cnt == 0) { ans = ans ^ a[1]; for (int i = 2; i <= n; i++) { ans = max(ans ^ a[i],ans); } } if (cnt == 0 || cnt == 2)printf("%lld\n",ans); else printf("Impossible\n"); } return 0; }```

1. 本站所有资源来源于用户上传和网络，如有侵权请邮件联系站长！
2. 分享目的仅供大家学习和交流，您必须在下载后24小时内删除！
3. 不得使用于非法商业用途，不得违反国家法律。否则后果自负！
4. 本站提供的源码、模板、插件等等其他资源，都不包含技术服务请大家谅解！
5. 如有链接无法下载、失效或广告，请联系管理员处理！
6. 本站资源售价只是赞助，收取费用仅维持本站的日常运营所需！
7. 如遇到加密压缩包，请使用WINRAR解压,如遇到无法解压的请联系管理员！