博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva10129 PlayOnWords(并查集,欧拉回路)
阅读量:6962 次
发布时间:2019-06-27

本文共 1580 字,大约阅读时间需要 5 分钟。

判断无向图是否存在欧拉回路,就是看度数为奇数的点有多少个,如果有两个,那么以那分别两个点为起点和终点,可以构造出一条欧拉回路,如果没有,就任意来,否则,欧拉回路不存在。

首先用并查集判断连通,然后统计度数。

#include
#include
#include
//#include
//#define localusing namespace std;const int maxl = 26;const int maxn = 1e3 + 3;int p[maxl];bool used[maxl];//出现过的字符char s[maxn];int Find(int x) {
return p[x] == x ? x : p[x] = Find(p[x]); }char last(char *p){ while(*(++p)); return *(p-1);}int deg[maxl];//出度 - 入度#define ID(c) (c-'a')int main(){#ifdef local freopen("in10129.txt","r",stdin);#endif // local int T,N; scanf("%d",&T); while(T--) { memset(used,false,sizeof(used)); memset(deg,0,sizeof(deg)); int cc = 26; for(int i = 0; i < maxl; i ++) { p[i] = i; } scanf("%d", &N); while(N--){ scanf("%s",s); int u = ID(*s), v = ID(last(s)); deg[u]++; deg[v]--; used[u] = used[v] = true; int s1 = Find(u), s2 = Find(v); if(s1 != s2) { p[s1] = s2; cc--; } } bool ok = false; for(int i = 0; i < maxl; i ++) { if(!used[i]) cc--; } int odd[maxl] = {
0},top = 0; if(cc == 1){ for(int i = 0; i < maxl; i ++) if(deg[i]) { odd[top++] = deg[i]; } if(top == 2 && (odd[0] == 1 || odd[1] == 1) ) ok = true;//入度sum = 出度sum else if(top == 0) ok = true; } if(ok) printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } return 0;}

 

转载于:https://www.cnblogs.com/jerryRey/p/4597641.html

你可能感兴趣的文章
我的友情链接
查看>>
日期转换练习
查看>>
Quartz 框架快速入门
查看>>
Memory Notification: Library Cache Object loaded into SGA
查看>>
linux initrd详解
查看>>
有关jqGrid应用里的字体大小不能控制的问题
查看>>
配置Tomcat连接池
查看>>
weblogic 配置连接过滤器设置ip黑白名单
查看>>
卸载了osc手机端,专心写博客
查看>>
kettle demo5 遍历目录下多文件,根据文件类型走不同方式导入到数据库
查看>>
我的友情链接
查看>>
win2008 防火墙 ipsec策略 路由和远程访问nat映射
查看>>
第一讲概述
查看>>
一场版本升级引发的性能血案 - 王者归来
查看>>
httpd 服务器的三大引擎 prefork、worker、event分析
查看>>
schedule和scheduleAtFixedRate
查看>>
golang之runtime.SetFinalizer
查看>>
tomcat 内存溢出
查看>>
操作用户 简介
查看>>
JDK工具(一)–Java编译器javac
查看>>