hdu1116 Play on Words 判断能否构成欧拉回路
2014-07-09 16:07
141 查看
<pre name="code" class="cpp">/* 这是道关于欧拉回路的问题, 最前面的字母是起点,最后的字母是终点. 有向图,要想能构成欧拉路径,首先必须是联通的.所以用并查集判断是不是一个祖先来判断是否是完全联通的图. 其次要保证,它的出度和入度要全相等或者恰好两个(起点和终点)的时候 出入度差值可以为一. */ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef __int64 LL; #define N 456976 int f[30]; int find(int a) { return f[a]==-1?a:f[a]=find(f[a]);} void unit(int a,int b) { int fa=find(a),fb=find(b); if(fa!=fb) { if(fb<fa) f[fa]=fb; else f[fb]=fa; } } int main() { int n,tt,i; int data[30];//是否 有该点. char a[1010]; int du[30][2];//0入度 1出度 scanf("%d",&tt); while(tt--) { memset(du,0,sizeof(du)); memset(f,-1,sizeof(f)); memset(data,0,sizeof(data)); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",a); du[a[0]-'a'][0]++;//首字母 du[a[strlen(a)-1]-'a'][1]++;//尾字母 data[a[0]-'a']=1;//有无访问 data[a[strlen(a)-1]-'a']=1; unit(a[0]-'a',a[strlen(a)-1]-'a'); } int shu=0; for(i=0;i<26;i++) { if(du[i][0]==du[i][1]+1) shu++; else if(du[i][0]+1==du[i][1]) shu++; else if(du[i][0]!=du[i][1]) break; } if(shu>2||shu==1||i!=26)//shu表示入度和出度不相同的数目. { printf("The door cannot be opened.\n"); continue; } shu=0; for(i=0;i<26;i++) { if(find(i)==i&&data[i]==1) shu++; } if(shu==1)//祖先数 { printf("Ordering is possible.\n"); } else printf("The door cannot be opened.\n"); } return 0; }
相关文章推荐
- C语言程序题目--闰年判断,三边能否构成三角形
- 已三个点坐标,判断能否构成三角形。若能,则求三角形外接圆的圆心和半径
- 从键盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形,若能,请算出面积·若不能就输出不能构成三角形。
- hdu 5971 Wrestling Match 判断能否构成二分图 [Problem A]2016ACM/ICPC亚洲区大连站
- 判断三个顶点能否构成三角形
- 判断a,b,c的值能否构成一个三角形
- 判断输入三条边能否构成三角形
- c语言:任给三条边长,判断能否构成三角形,如果能,求出其面积和周长
- 一个窗口,用户输入三个数,你判断能否构成三角形以及面积
- 29.输入三个实数,判断能否构成三角形;若能,再说明是何种类型的三角形
- 输入三角形的三边值,判断能否构成三角形
- 判断三个边能否构成三角形,并判断能够成什么三角形(锐角、钝角、直角)
- 判断能否构成三角形(异常处理)
- hdu 5971 Wrestling Match 判断能否构成二分图
- 输入三个数,判断能否构成锐角三角形
- 判断输入的三角形边长能否构成三角形
- Java练习题15 判断能否构成三角形
- if else 应用之经典例题判断能否构成三角形并输出面积
- 简单的判断三个数能否构成三角形
- JAVA之1.封装一类三角形对象Triangle,该类对象具有三条边的属性,具有初始化三角形的功能、修改边长的功能、判断三条边能否构成三角形的功能、求周长的功能、求面积的功能。