hdu5883 The Best Path(欧拉路)

题目链接:hdu5883 The Best Path

比赛第一遍做的时候没有考虑回路要枚举起点的情况导致WA了一发orz

节点 i 的贡献为((du[i] / 2) % 2)* a[i]

欧拉回路的起点贡献多一次,欧拉通路起点和终点也多一次。

代码如下:

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<vector>
 5 #include<set>
 6 #define CLR(a,b) memset((a),(b),sizeof((a)))
 7 using namespace std;
 8 
 9 const int N = 100003;
10 const int inf = 0x3f3f3f3f;
11 int n, m;
12 int a[N];
13 int du[N];
14 
15 int main(){
16     int t, i, j, b, c, f, ans, dd, ma;
17     scanf("%d", &t);
18     while(t--){
19         ans = 0;
20         scanf("%d %d", &n, &m);
21         f = 0;
22         ma = 0;
23         CLR(du, 0);
24         for(i = 1; i<= n; ++i)
25             scanf("%d", &a[i]);
26         for(i = 1; i <= m; ++i){
27             scanf("%d %d", &b, &c);
28             du[b]++; du[c]++;
29         }
30         dd = 0;
31         for(i = 1; i <= n; ++i){
32             if(du[i]%2) dd++;
33         }
34         if(dd == 2 || dd==0) f = 1; // 欧拉路的奇度顶点数为 2 或 0
35         if(!f){printf("Impossible\n");continue;}
36         for(i = 1; i<= n; ++i){
37             if(((du[i] + 1)/2) %2 == 1)
38                 ans ^= a[i];
39         }
40         if(!dd){//欧拉回路时枚举起点
41             for(i = 1; i <= n; ++i){
42                 int t = ans ^a[i];
43                 ma= max(ma, t);
44             }
45             ans = ma;
46         }
47         printf("%d\n", ans);
48     }
49     return 0;
50 }

 

posted @ 2016-09-17 21:23  GraceSkyer  阅读(611)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……