首页 > 其他分享 >单词游戏 题解

单词游戏 题解

时间:2024-09-11 09:25:25浏览次数:9  
标签:游戏 fa int 题解 入度 单词 ++ find

四倍经验

51nod 2875 单词游戏

acwing 1185. 单词游戏

洛谷 SPOJ WORDS1 - Play on Words

单词 Play on Words

我们可以将每一个字母看成一个节点,这样我们就有了一个包含 26 个节点的图,对于读入的单词,我们将首字母和尾字母对应的节点之间建有向边(中间的字母没什么用就不管了)。

此时我们发现题目简化为:在一个有向图上,找到一条路径,使每条边都经过一次并且仅经过一次。

可以发现这正是欧拉路径问题,但是!你并不需要真的建图来跑一遍欧拉路径,只需对这张图判断是否存在欧拉路径即可。

欧拉路径的判定(有向图):除了起点和终点,点的入度等于出度。起点入度比出度小 1,终点入度比出度大 1。

注意判断图是否连通,用并查集就可以。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
int t;
int fa[100005];//为了并查集 
int in[100005];//入度 
int out[100005];//出度 

int find(int x){//用并查集维护连通性 
	return (fa[x]==x)?x:find(fa[x]);
}

int main() {
    ios::sync_with_stdio(false);
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=0;i<26;i++){//初始化 
			in[i]=0;
			out[i]=0;
			fa[i]=i;
		}
		for(int i=1;i<=n;i++){
			string s;
			cin>>s;
			int l=s[0]-'a';//首字母 
			int r=s[s.size()-1]-'a';//尾字母 
			fa[find(l)]=find(r);//连有向边 
			in[r]++;//入度增加 
			out[l]++;//出度 
		}
		int cnt=0;
		for(int i=0;i<26;i++){//判断连通性,判断是否存在不合法的节点 
			if(((out[i]||in[i])&&(find(i)==i))||abs(in[i]-out[i])>1){
				cnt++;
			}
		}
		if(cnt>1){//不合法 
			cout<<"The door cannot be opened.\n";
			continue;
		}
		int s=0;//起点数 
		int t=0;//终点数 
		for(int i=0;i<26;i++){
			if(in[i]>out[i]){//终点统计 
				t++;
			} 
			if(in[i]<out[i]){//起点统计 
				s++;
			}
		}
		if((s!=t)||t>1){//起点终点数都应该为 1 
			cout<<"The door cannot be opened.\n" ;
			continue;
		}
	   	cout<<"Ordering is possible.\n";
	}
    return 0;
}

标签:游戏,fa,int,题解,入度,单词,++,find
From: https://www.cnblogs.com/sadlin/p/18407667

相关文章

  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
    ......
  • 【秋招笔试】9.08字节跳动秋招(已改编)-三语言题解
    ......
  • 挑战不可能篇1——洛谷28分钟14道CCF GESP C++ 一级上机题&洛谷14道题题解
    扯谈今天继续挑战不可能:洛谷28分钟14道题这我个人认为不简单,算上编译、提交、命名等杂七杂八的东东之后,只剩下了大约1分钟/题。本次挑战的是CCFGESPC++一级上机题.这竟然能成功!下面附上每一题第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题......
  • [ARC106F] Figures 题解
    生成函数大法好。思路考虑prufer序列。如果\(n\)个点的度数确定,那么生成树个数为:\[\frac{(n-2)!}{\prod(d_i-1)}\]那么在此题中,\(n\)个点的度数确定,那么方案数为:\[\frac{(n-2)!}{\prod(d_i-1)}\prod\frac{a_i!}{(a_i-d_i)!}\]其中,\(\sumd_i=2\timesn-2\)。容易发......
  • CF1672F2 Checker for Array Shuffling 题解
    题目链接点击打开链接题目解法我怎么F1都不会做/llF1:由原始值向最终值连边如果是排列的话,操作次数显然为\(n-\)环数拓展到非排列的情况,即相同数之间的下标可以选择顺序,要求分出来的环数最大直接考虑上面的这东西,让我进入了死胡同。。先给出一个结论:最大环数的最小值是......
  • Java实现英语作文单词扫盲程序
    来自背英语四级单词的突发奇想:是否可以通过Java语言实现一个随机抽取作文中单词进行复习的程序。首先,展示下成果:点击查看代码packageDemo;importjava.util.ArrayList;importjava.util.Random;importjava.util.Scanner;publicclassrandom_words{publicstati......
  • 【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?
    【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?场景一、JAVA程序中某个线程占用CPU飙高,问题定位top、jstack命令的使用四步教你快速定位问题代码1.top命令获取异常的java进程PID   top2.查询异常进程中的线程情况,获取异常......
  • [ARC073F] Many Moves 题解
    [ARC073F]ManyMoves题解个人感觉其实还挺套路的题目。不配紫题。对于两个玩意在数轴上跑来跑去这种题目,常见的套路是固定一个点的位置,用另一个点的位置设为状态。对于本题,题目已经帮你固定了一个点,于是我们设\(dp_{x}\)表示一个点在当前要求的位置,另一个点在\(x\)的最小......
  • ABC370 DEF 题解
    ABC370DEF题解赛时过了ABCD,补题的时候发现EF其实也是简单题,为什么就做不出来呢?E这样简单的dp都做不出来,dp必须得多练啊!D-CrossExplosion题目链接对于每一行、列,我们要用一个数据结构来维护未被删除的点,并且要快速找到某一行/列中是否存在某个数,以及查询某个数的前......
  • 「NOI2021 D1T3 庆典」题解
    uoj675加强:\(\sumk\le6\times10^5\)暴力\(u\)在\(s\Rightarrowt\)路径上\(\iff\)正图上\(s\Rightarrowu\)且反图上\(u\Rightarrowt\)时间复杂度\(O((n+m)q)\)正解只关心可达性,不妨SCC缩点成DAG。注意到一个奇怪的条件:对于三座城市\(x,y,z\),若\(x\Right......