HDU 5883 The Best Path 2016 ACM/ICPC Asia Regional Qingdao Online 1006d

来源:互联网 发布:linux mv 目录 编辑:程序博客网 时间:2024/06/17 02:27

判断一下是不是欧拉路径

#include<stdio.h>#include<iostream>#include<memory.h>#include<stdlib.h>#include<cstdio>#include<cstring>#include<queue>#include<set>#include<algorithm>using namespace std;const int MAXN = 100005;const int MAXM = 500005;const int INF = 0x3f3f3f3f;typedef long long LL;int T, N, M;int v[MAXN], cnt[MAXN];struct Edge{int b;int next;}edge[2 * MAXM];int len = 1;int head[MAXN];void AddEdge(int a, int b){edge[len].b = b;edge[len].next = head[a];head[a] = len++;edge[len].b = a;edge[len].next = head[b];head[b] = len++;cnt[a]++;cnt[b]++;}int flag[MAXN];int travelCnt = 0;void Travel(int st){travelCnt++;flag[st] = 1;int p = head[st];while (p){if (!flag[edge[p].b]){Travel(edge[p].b);}p = edge[p].next;}}int main(void) {#ifndef ONLINE_JUDGE//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);#endifint T;scanf("%d", &T);{int i, j, k;int res;for (int ca = 1; ca <= T; ca++){scanf("%d%d", &N, &M);for (i = 1; i <= N; i++){scanf("%d", &v[i]);}memset(head, 0, (N + 1) * sizeof(int));memset(cnt, 0, (N + 1) * sizeof(int));len = 1;int a, b;for (i = 0; i < M; i++){scanf("%d%d", &a, &b);AddEdge(a, b);}int st[2], num = 0;bool impossible = false;for (i = 1; i <= N; i++){if (cnt[i] % 2){if (num >= 2){impossible = true;break;}st[num++] = i;}}if (1 == num){impossible = true;}else if (0 == num){st[0] = 1;}if (!impossible){travelCnt = 0;memset(flag, 0, (N + 1) * sizeof(int));Travel(st[0]);if (travelCnt != N){impossible = true;}}if (!impossible){res = 0;for (i = 1; i <= N; i++){if (cnt[i] % 2){res ^= (((cnt[i] / 2) + 1) % 2 * v[i]);}else{res ^= ((cnt[i] / 2) % 2 * v[i]);}}if (0 == num){int max = 0;for (i = 1; i <= N; i++){if ((res ^ v[i]) > max){max = (res ^ v[i]);}}res = max;}}if (impossible){printf("Impossible\n");}else{printf("%d\n", res);}}}return 0;}


0 0
原创粉丝点击