Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 297 Accepted Submission(s): 130
this
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100005; struct Edge{ int u, v; bool tag; int getTo(int u) { if(this->u == u) return v; else return this->u; } }es[500005]; int n, m, val[MAXN],deg[MAXN], res; vector<int> arc[MAXN]; void dfs(int u) { for(int i = 0, size = arc[u].size(); i < size; i++) { int id = arc[u][i]; if(!es[id].tag) { es[id].tag = true; int to = es[id].getTo(u); dfs(to); } } res ^= val[u]; } int par[MAXN]; void prep() { for(int i = 0; i < MAXN; i++) { par[i] = i; } } int fnd(int x) { if(x == par[x]) { return x; } return par[x] = fnd(par[x]); } void unite(int fa, int son) { int a = fnd(fa); int b = fnd(son); par[b] = a; } int main() { // freopen("input.in", "r", stdin); int T; scanf("%d", &T); while(T--) { prep(); res = 0; memset(deg, 0, sizeof(deg)); scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { arc[i].clear(); scanf("%d", &val[i]); } for(int i = 0; i < m; i++) { int u, v; scanf("%d %d", &u, &v); es[i].u = u; es[i].v = v; es[i].tag = false; arc[u].push_back(i); arc[v].push_back(i); deg[u]++; deg[v]++; unite(u, v); } int start = 1; int cnt = 0; for(int i = 1; i <= n; i++) { if(deg[i] & 1) { start = i; cnt++; } } int rt = -1, sum = 0; for(int i = 1; i <= n; i++) { int fa = fnd(i); if(fa != rt) { rt = fa; sum++; } } if((cnt == 0 || cnt == 2) && sum == 1) { dfs(start); if(cnt == 2) { printf("%d\n", res); } else { int mx = -1; for(int i = 1; i <= n; i++) { mx = max(mx, res ^ val[i]); } printf("%d\n", mx); } } else { printf("Impossible\n"); } } return 0; }