思路:这道题,有一个很巧妙的转换,把点变成边。以26个字母作为顶点;对于每一个盘子,如果它的首字母为c1,末字母为c2,那么从c1向c2连一条有向边。如下图。然后判断图连通,再判断它是否为欧拉图
PS:因为有重边,用边表建图时(在建图时加判断 用边表也可以),会超时,用邻接矩形比较好 因为只有26个点。
//172K
313MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define VM 30
int indeg[VM],outdeg[VM],mat[VM][VM],start;
bool vis[VM];
void dfs (int u)
{
0; i < 26; i ++)
if (mat[u][i])
{
mat[u][i] = 0;
dfs(i);
}
}
bool cmp()
{
i,k,sum1,sum2,sum3;
= sum3 = 0;
i < 26; i ++)
if (indeg[i] - outdeg[i] == 1)
sum1 ++;
if (outdeg[i] - indeg[i] == 1)
{
sum2 ++;
start = i;
}
if (indeg[i] ==
outdeg[i]&&indeg[i]!= 0)
k = i;
if (abs(indeg[i] - outdeg[i]) > 1)
sum3 ++;
> 1||sum2 > 1||sum3 >
0)
return false;
0)
start = k;
true;
}
int main ()
{
T,n;
flag;
str[1005];
("%d",&T);
--)
scanf ("%d",&n);
memset (indeg,0,sizeof(indeg));
memset (outdeg,0,sizeof(outdeg));
memset (mat,0,sizeof(mat));
memset (vis,false,sizeof(vis));
while (n --)