Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
谁能帮我看看,这道题就是判欧拉路径和连通吧,还有其他tricks?为什么老是wa#include<stdio.h> #include<memory.h> #include<stdlib.h> #include<string.h> #ifdef debug #define input file FILE*file=fopen("tmp.txt","r"); #else #define input stdin #endif #define SIZE 100000 #define WORD 1000 int in[26]; //入度出度判欧拉路径 int out[26]; int visited[26]; int uset[26]; //并查集判联通 int T,N; int root(int i){ if(uset[i]==i)return i; uset[i]=root(uset[i]); return uset[i]; } void combine(int i,int j){ uset[uset[j]]=uset[i]; } int main(){ fscanf(input,"%d",&T); while(T--){ fscanf(input,"%d",&N); int i,j; char s[WORD+1]; memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(visited,0,sizeof(visited)); for(i=0;i<26;i++){ uset[i]=i; } for(i=0;i<N;i++){ fscanf(input,"%s",s); int first,last; first=s[0]-'a'; last=s[strlen(s)-1]-'a'; in[first]++; out[last]++; visited[first]=1; visited[last]=1; if(root(first)!=root(last))combine(first,last); } int num_in=0,num_out=0; for(i=0;i<26;i++){ //判欧拉路径 if(!visited[i])continue; if(in[i]!=out[i]){ if(in[i]==(out[i]-1))num_in++; else if(in[i]==(out[i]+1))num_out++; else break; } } if(i<26||(num_in!=1)||(num_out!=1)){ printf("The door cannot be opened.\n"); continue; } for(i=0;i<26;i++){ //判联通 if(visited[i])break; } int _root=root(i); for(i++;i<26;i++){ if(visited[i]&&root(i)!=_root)break; } if(i<26){ printf("The door cannot be opened.\n"); continue; } printf("Ordering is possible.\n"); } system("pause"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator