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 |
1094 TLE我的思路是每次读入一个关系,先判断有没有环,再用拓扑排序,是不是这样每次先判断有没有环的缘故?高人能不能指点一下,不胜感激。 #include <iostream> #include <cstdio> #define N 26 using namespace std; int rel[N][N+1]; int f[N]; int n,m; char ans[N+1]; bool search(int j){ int i; for(i=1;i<=rel[j][0];i++){ if(f[rel[j][i]]) return true; f[rel[j][i]]=1; if(search(rel[j][i])) return true; f[rel[j][i]]=0; } return false; } bool havecircle(){ int i; memset(f,0,sizeof(int)*n); for(i=0;i<n;i++){ if(!f[i]&&rel[i][0]){ f[i]=1; if(search(i)) return true; f[i]=0; } } return false; } bool toposort(){ int deg[N]; int zero[N+1],flag[N],top; int i,j,t,cnt; memset(deg,0,sizeof(int)*n); //初始化 for(i=0;i<n;i++){ for(j=1;j<=rel[i][0];j++) deg[rel[i][j]]++; flag[i]=0; //初始化 } for(i=0,top=0;i<n;i++){ if(!deg[i]) zero[++top]=i; } cnt=0; while(cnt<n){ if(top==0||top>1) break; t=zero[top]; ans[cnt++]=t+'A'; flag[t]=1; for(j=1;j<=rel[t][0];j++) deg[rel[t][j]]--; for(i=0,top=0;i<n;i++){ if(!flag[i]&&!deg[i]) zero[++top]=i; } } if(cnt>=n){ ans[n]=0; return true; } return false; } int main(){ char a,ch,b; int i,yes,k,j; while(cin>>n>>m&&(n||m)){ for(i=0;i<n;i++) rel[i][0]=0; for(i=1,yes=0;i<=m;i++){ cin>>a>>ch>>b; if(yes!=0) continue; k=a-'A'; for(j=1;j<=rel[k][0];j++){ if(rel[k][j]+'A'==b) break; } //判断这个关系以前有没有出现过 if(j>rel[k][0]){ rel[k][++rel[k][0]]=b-'A'; if(havecircle()) yes=-i; else if(toposort()) yes=i; } } if(yes==0) printf("Sorted sequence cannot be determined.\n"); else if(yes>0) printf("Sorted sequence determined after %d relations: %s.\n",yes,ans); else printf("Inconsistency found after %d relations.\n",-yes); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator