【TOJ】1416. Catenyms --欧拉路

我明明是参考kobe的写的,他的0.00s,我的0.02。。后来发现他先把单词存到string数组,然后对string数组sort排序,然后再赋值到结构体,我在这个代码基础上加了之后变成0.01。。我从南开大学上找了个没我快的程序交在TOJ上,不仅没用时间还排在了第二。。。。。

Show Code - Run ID 927792

Submit Time: 2010-07-12 09:38:43     Language: GNU C++     Result: Accepted
    Pid: 1416     Time: 0.02 sec.     Memory: 1236 K.     Code Length: 2.1 K.

 

#include #include #include #include using namespace std; #define MAXN 27 struct node{ string str; int a,b; }word[1005]; int mat[MAXN][MAXN],path[1001],n,in_d[MAXN],out_d[MAXN],t; bool f[1001]; bool cmp(node a,node b){ return a.str=0;i--) cout<<"."<>word[i].str; word[i].a=word[i].str[0]-'a'; word[i].b=word[i].str[word[i].str.size()-1]-'a'; out_d[word[i].a]++; in_d[word[i].b]++; mat[word[i].a][word[i].b]=1; } sort(word,word+t,cmp); for(i=cnti=cnto=0;i<26;i++){ if(in_d[i]-out_d[i] == 1) cnti++; else if(in_d[i]-out_d[i] == -1) cnto++; else if(in_d[i] != out_d[i]) break; } if(i<26 || !direct()) {printf("***/n");continue;} if(cnti==0 && cnto==0){//欧拉回路 for(i=cnt=0;i<26;i++) if(out_d[i]) break; find_path_d(i,cnt); print(cnt); } else if(cnti==1 && cnto==1){//欧拉路 for(i=cnt=0;i<26;i++) if((out_d[i]-in_d[i])==1) break;//起点 find_path_d(i,cnt); print(cnt); } else printf("***/n"); } //system("pause"); return 0; }

 

突然发现我程序中的一个bug。

3
cb
ba
aa

这组数据应该输出cb.ba.aa我的输出无解

只要把61行改成mat[word[i].a][word[i].b]=mat[word[i].b][word[i].a]=1;就对了~

这样建成无向图的话,判连通性时,从随便那个已有的点开始就行

而判断欧拉路性质的出度入度也不受影响~

 

宝哥为这WA了很久,我的竟然过了,神奇~RP~

你可能感兴趣的:(ACM)