博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ-10106(有向图欧拉回路的判断)
阅读量:4671 次
发布时间:2019-06-09

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

题目链接:

思路:

(1)将每个单词视为有向路径,单词的起始字母是起始节点,末尾字母是终止节点,然后找由字母建立的有向图

是否是欧拉图或者半欧拉图。

(2)先用并查集判断是否连通,再判断入度与出度的·关系是否符合要求。

#include
#include
#include
#include
#include
using namespace std;const int maxn = 100100;int fa[120],in[120],out[120];string ss[maxn];struct Edge{ int to,next,id;}edge[maxn*2];int vis[maxn],head[maxn],tot;int f(int x){ if(fa[x]==0) return x; else return fa[x]=f(fa[x]);}void Init(){ memset(fa,0,sizeof(fa)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(vis,0,sizeof(vis)); memset(head,0,sizeof(head)); tot=0;}void add(int x,int y,int w){ edge[tot].to=y; edge[tot].next=head[x]; edge[tot].id=w; head[x]=tot++;}int main(void){ //printf("%d\n",'z'-'a'+1); int N,i,n,j,x,y,t1,t2; scanf("%d",&N); while(N--){ scanf("%d",&n); Init(); for(i=1;i<=n;i++){ cin>>ss[i]; x=ss[i][0]-'a'+1; y=ss[i][ss[i].length()-1]-'a'+1; t1=f(x);t2=f(y); if(t1!=t2) fa[t2]=t1; in[y]++; out[x]++; add(x,y,i); } int fg=1; x=f(x); for(i=1;i<=n;i++){ y=ss[i][0]-'a'+1; if(f(y)!=x){ fg=0;break; } y==ss[i][ss[i].length()-1]-'a'+1; if(f(y)!=x){ fg=0;break; } } if(fg==1){ int tt=1,cc=0; for(i=1;i<=26;i++){ if(abs(in[i]-out[i])>1){ tt=0;break; } else if(abs(in[i]-out[i])==1){ cc+=(in[i]-out[i]); } } if(tt==1&&cc==0) printf("Ordering is possible.\n"); else printf("The door cannot be opened.\n"); } else printf("The door cannot be opened.\n"); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/2018zxy/p/10362918.html

你可能感兴趣的文章
项目应用EasyUI_Tab控件全部关闭
查看>>
CTF之信息泄漏
查看>>
JavaScript作用域
查看>>
matlab 启动图标
查看>>
Transaction
查看>>
0001-Hello world(第一弹)
查看>>
瞎说一波3种基本背包问题【希望巨巨们指出错误】
查看>>
萌新笔记之交换排序
查看>>
[HEOI2016/TJOI2016]求和(第二类斯特林数)
查看>>
一道阿里面试题
查看>>
pta 习题集5-19 列车厢调度
查看>>
浅谈Ddos攻击攻击与防御
查看>>
HOJ 2148&POJ 2680(DP递推,加大数运算)
查看>>
HOJ 2156 &POJ 2978 Colored stones(线性动规)
查看>>
EL表达式学习笔记(JSTL)
查看>>
mybatis按datetime条件查询,参数为时间戳时
查看>>
常见软件开发模型
查看>>
改进方案1.0
查看>>
C#使用Monitor类、Lock和Mutex类进行多线程同步
查看>>
在O(1)时间删除链表结点
查看>>