判断是否存在欧拉路径,而且图必需连通!
第二点忘记判断了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这个头文件
爆内存。。