HDU——1116解题报告
2014-04-27 13:12
302 查看
这一题也是让我纠结了好久,首先判断是否为一个图,用并查集判断,之后若是一个图,则判断是否为欧拉回路或欧拉通路,欧拉回路即每个顶点出度和入度相等,欧拉通路即只有一个顶点出度比入度大1,一个入度比出度大1,其余相等,但是为什么在并查集合并的时候交换顺序就WA了呢,我对并查集也不是理解的很深,难道元素的顺序还影响并查集的合并结果??牛人快来解答一下啊。代码如下:
#include <iostream> #include <string> #include <cstring> using namespace std; const int maxn=1<<5; int set[maxn],in[maxn],out[maxn]; int find(int x) { if(set[x]==x) return x; else return find(set[x]); } int main() { int t; cin>>t; while(t--){ int n; string t; cin>>n; for(int i=1;i<=maxn;i++) set[i]=i; memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(int i=1;i<=n;i++){ int a,b; t.clear(); cin>>t; a=t[0]-'a'+1; b=t[t.size()-1]-'a'+1; if(find(a)!=find(b)) set[b]=a; //就是这里,换成set[a]=b就会WA,WHY?????? in[a]++; out[b]++; } int nset=0; for(int i=1;i<=26;i++) if(set[i]==i&&(in[i]||out[i])) nset++; if(nset>1) {cout<<"The door cannot be opened.\n";continue;} int nc=0,nr=0,e=0; for(int i=1;i<=26;i++){ if(in[i]-out[i]==1) nr++; else if(out[i]-in[i]==1) nc++; else if(in[i]!=out[i]) e++; } if(nr==1&&nc==1&&e==0) cout<<"Ordering is possible.\n"; else if(nr==0&&nc==0&&e==0) cout<<"Ordering is possible.\n"; else cout<<"The door cannot be opened.\n"; } return 0; }
相关文章推荐
- hdu1116--解题报告--初步了解欧拉回路
- hdu1116--解题报告--初步了解欧拉回路
- hdu 1008 Elevator 的解题报告
- HDU 5014解题报告
- 杭电acm1019 hdu-acm-101解题报告
- HDU 1005 解题报告
- 杭电acm1019 hdu-acm-101解题报告
- 母函数简介及简单使用(附HDU 1284 钱币兑换问题 解题报告)
- HDU 1018 Big Number数论(解题报告)
- hdu 1754 I Hate It 解题报告(线段树 代码+注释)
- BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
- HDU 2063过山车 解题报告(我的第一道二分匹配)
- 解题报告:HDU_6185 Covering (轮廓线DP+高斯消元+矩阵快速幂)
- hdu 3367 Pseudoforest (伪森林) not 最大生成树 解题报告
- hdu 1071 - The area(解题报告)
- hdu 1213 How Many Tables 解题报告
- HDU 4135 Co-prime 解题报告(因式分解 + 容斥原理)
- hdu 4419 Colourful Rectangle 杭州赛区 1010 (解题报告)
- HDU 4770 Lights Against Dudely 解题报告
- HDU Count 101 解题报告