MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HOJ 1033

Posted on 2011-08-12 11:08  MDeath-Kid  阅读(180)  评论(0编辑  收藏  举报

判断是否存在欧拉路径,而且图必需连通!

第二点忘记判断了WA了几次。

HOJ 1033
#define MAXN 1005
#define _ufind_run(x) for(;p[t=x];x=p[x],p[t]=(p[x]?p[x]:x))
#define _run_both _ufind_run(i);_ufind_run(j)

struct ufind{
int p[28],t;
void init(){memset(p,0,sizeof(p));}
void set_friend(int i,int j){_run_both;p[i]=(i==j?0:j);}
int is_friend(int i,int j){_run_both;return i==j&&i;}
}f;
int n;
int hru[27],hcu[27];
bool record[27];
char ss[MAXN];


void init() {
f.init();
scanf(
"%d",&n);
memset(record,
false,sizeof(record));
memset(hru,
0,sizeof(hru));
memset(hcu,
0,sizeof(hcu));
for(int i = 0;i<n;i++) {
scanf(
" %s",ss);
hcu[ss[
0]-'a']++;
hru[ss[strlen(ss)
-1]-'a']++;
f.set_friend(ss[
0]-'a'+1,ss[strlen(ss)-1]-'a'+1);
record[ss[
0]-'a'] = true;
record[ss[strlen(ss)
-1]-'a'] = true;
}
int tmp = 0;
while(!record[tmp]) tmp++; //下面判断图是否连通
for(int i = tmp+1;i<27;i++) {
if(record[i]) {
if(!f.is_friend(tmp+1,i+1)) {
tmp
= 99;
break;
}
}
}
if(tmp == 99) {
puts(
"The door cannot be opened.");
return;
}
int beg =0,end=0;
for(int i = 0;i<27;i++) {
tmp
= hru[i] - hcu[i];
if(tmp == 0) continue;
else if(tmp == -1) end++; //出入度
else if(tmp == 1) beg++;
else {end = beg = 1000;break;}
}
//出入度为1和-1各一个,或者是欧拉回路
if((end == 0 && beg == 0) || (end == 1 && beg == 1)) {
puts(
"Ordering is possible.");
}
else {
puts(
"The door cannot be opened.");
}
return;
}


int main() {
FOPEN
int cse;scanf("%d",&cse);
while(cse --) {
init();
}
return 0;
}

  而且这个题目不能用IOSTREAM这个头文件

爆内存。。