HDU-5883-The Best Path【2016青岛】【欧拉路】
5883-The Best PathProblem Description Input 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 Sample Input Sample Output 题目链接:HDU⑸883 题目大意: n 个点 m 条无向边的图,找1个欧拉通路/回路使得这个路径所有结点的异或值最大 题目思路:根据欧拉路的性质,
所以分为两种情况讨论: 1.欧拉回路 2.欧拉通路 注意: 以下是代码: #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,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("Impossiblen");
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("%lldn",ans);
else printf("Impossiblen");
}
return 0;
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |