HDU 5883 The Best Path (一笔画 / 欧拉通路)
来源:互联网 发布:千牛什么时候出mac版 编辑:程序博客网 时间:2024/05/23 01:19
思路:
首先需要判断整张图是否连通,想象这么一种情况,一张图由中间切开左右分为两部分,左右的点都没有能连接的边,而他们自己的部分内有边连接。这样的话显然是无法走遍所有边的。所以我们需要并查集来判断是不是所有点在一个连通分量里。然后这里我们遇到两个问题,1)是否存在孤立点,就是这个点与其他所有的点都没有边连接,这样的话按照题目要求走遍所有的边貌似也可以。。。但之后的ac证明了应该是没有这种情况。2)并查集之后T了。。。然后把查的函数加了路径压缩就过了,大概快了1.5s。
然后接下来的问题就是欧拉通路的变形了。
每个点都有一个值,问你最后取异或之后的最大值。
(在连通的基础上)首先我们先考虑是否能构成一笔画。当然伟大的欧拉早就得出了结论:
奇点的个数等于0或者2的时候有解。奇点就是入度出度加起来为奇数的点(进出不平衡)。
在这里需要再引入一个性质:一个数m,异或n之后,再异或n,等于m。
所以我们在接下来的分析中只需要判断这个点需要异或的次数的奇偶就可以判断是否要异或进答案。
当奇点的个数为0时:
我们先假装没有起点和终点(因为这两个点的性质比较特殊),把所有点都判断一下 (入度+出度)/2 是否是奇数,是的话就说明这个点要异或进ans。
然后从 ans ^ v[i] 中挑出最大的那个就是答案了。
当奇点的个数为2时:
这两个奇点一定一个入读比出度大一(终点),一个出度比入读大一(起点),而这两个点都是需要额外加一次异或的,所以我的操作是 (入度+出度+1)>>1 ,这样的话偶点的性质不改变,奇点成功加了一次异或。然后输出答案就好。
写给自己看的坑点:
本来是三个平行的选择,但是选(写)错了。。。
把if,else if,else 写成了 if if else
玛德之杖(哭)。。。。
AC代码(改):
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;int v[100010];int in[500010];int out[500010];int bcset[100010];// 并查集int cha(int x){ int xx = x; while(bcset[xx] != xx){ xx = bcset[xx]; } int temp; while(xx != x){ // 路径压缩 temp = bcset[x]; bcset[x] = xx; x = temp; } return x;}void bing(int i,int j){ int x = cha(i); int y = cha(j); if(x != y){ bcset[x] = y; } return;}int main(){ int t; int n,m; int be,ed; scanf("%d", &t); while(t--){ memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++){ scanf("%d",v+i); bcset[i] = i; } for(int i = 1;i <= m;i++){ scanf("%d%d",&be,&ed); out[be]++; in[ed]++; bing(be,ed); } int connect = 0; for(int i = 1;i <= n && connect < 2;i++){ if(bcset[i] == i){ connect++; } } if(connect != 1){ // 此图不连通 printf("Impossible\n"); continue; } int oddnum = 0; for(int i = 1;i <= n;i++){ if((in[i]+out[i])&1){ oddnum++; } } int ans = 0; if(oddnum == 0){ for(int i = 1;i <= n;i++){ if((in[i]+out[i])>>1&1){ ans ^= v[i]; } } int Ans = 0; for(int i = 1;i <= n;i++){ Ans = max(Ans,ans^v[i]); } printf("%d\n",Ans); } else if(oddnum == 2){ for(int i = 1;i <= n;i++){ if((in[i]+out[i]+1)>>1&1){ ans ^= v[i]; } } printf("%d\n",ans); } else{ printf("Impossible\n"); } } return 0;}
- HDU 5883 The Best Path (一笔画 / 欧拉通路)
- HDU 5883 The Best Path (枚举 欧拉通路)
- HDU-5883 The Best Path(欧拉通路和欧拉回路)
- HDU 5883 The Best Path(欧拉通路与欧拉回路)
- HDU 5883 The Best Path (欧拉通路) 2016 ACM/ICPC Asia Regional Qingdao Online
- 一笔画问题(欧拉通路)
- hdu5883 The Best Path(欧拉通路、欧拉回路)
- HDU 3018 Ant Trip(欧拉回路 欧拉通路,一笔画问题)
- hdu 5883 The Best Path 欧拉路径(回路)
- hdu 5883 The Best Path 欧拉回路(路径)
- hdu5883The Best Path(欧拉通路&&欧拉回路)
- nyist 42一笔画(欧拉通路)
- NYOJ 一笔画问题(判断存在欧拉通路)
- 一笔画问题(欧拉通路)
- HDU 5883 The Best Path(欧拉路径\回路)
- HDU 5883 The Best Path(欧拉道路+回路)
- HDU 5883 The Best Path 欧拉路径/回路
- hdu 5883 The Best Path【欧拉路经/欧拉回路】
- tcpdump
- Linux服务管理
- babel 编译es6 connot find preset 解决方案
- MySQL性能优化的最佳21条经验
- Unity+Vuforia SDKAR开发系列教程--2.1.3 Vuforia许可证购买
- HDU 5883 The Best Path (一笔画 / 欧拉通路)
- C#中的静态与非静态方法比较
- Java 8新特性
- java实现八大排序
- 关于线程同步和互斥的关系与区别
- curl 实现 url连接 post Json消息
- C语言内存分布
- caffe结构解析
- 单利模式小结