POJ 1386 Play on Words

2015-07-24 05:41:44 · 作者: · 浏览: 7

欧拉回路问题。

题意是说给你一些字符串,类似于成语接龙,上一个字符串尾字母必须和下一个字符串首字母相同。

把所有字符串连成一串。

根据定理判断欧拉通路,然后DFS判连通(并查集也可)

没注意题意 字符串开了str[100] 结果RE。结果字符串最长有1000.改了就AC了。


#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         #include
         #include
         
           #include
          
            #include
           
             #include
            
              #include
             
               #define INF 0x7fffffff #define eps 1e-6 using namespace std; int n,m; int g[27][27]; int in[27],out[27]; bool vis[27]; int start; bool Euler() { int I=0,O=0; for(int i=0; i<26; i++) { if(in[i]==out[i]+1)I++; else if(out[i]==in[i]+1)O++,start=i; else if(in[i]!=out[i])return 0; } if((I==0&&O==0)||(I==1&&O==1))return 1; return 0; } void dfs(int i) { int j; for( j=0; j<26; j++) { if(g[i][j]==0)continue; g[i][j]--; vis[i]=vis[j]=1; dfs(j); } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&m); char str[1001]; memset(g,0,sizeof(g)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(int i=0; i
              
               0){start=i;break;} bool flag=1; flag=Euler(); if(!flag) { puts("The door cannot be opened."); continue; } memset(vis,0,sizeof(vis)); dfs(start); for(int i=0; i<26; i++) { if(in[i]||out[i]) { if(vis[i]==0) { flag=0; break; } } } if(flag)puts("Ordering is possible."); else puts("The door cannot be opened."); } }