一般的拓扑算法只有一种输出,这个可以把所有的可能都输出^)^:#include<iostream>#include<string>using namespace std;#define max 10#define arraysizemax 20int total=0;class Point {public:Point(char i){value=0; used=0; name=i; for(int j=0;j<max;j++) next[j]=0;}Point* operator->() {return this;} int size(){return used;}int value;int used;char name;Point* next[max];}; Point* HEAD; void Initial(){char i,j;cin>>i>>j;Point* head=new Point(i);Point* second=new Point(j);head->next[0]=second;second->next[0]=head;head->next[1]=second;head->used++;second->value++;total=total+2;while(cin>>i>>j){int in=0,jn=0; Point* ip=0,*jp=0; Point* p=head; do{if(p->name==i) {ip=p;in=1;p=p->next[0];continue;} if(p->name==j) {jp=p;jn=1;p=p->next[0];continue;} p=p->next[0]; }while(p!=head); if(in){if(jn){int usedtemp=(++ip->used); ip->next[usedtemp]=jp; jp->value++;}else{ jp=new Point(j); total++; int usedtemp=(++ip->used); ip->next[usedtemp]=jp; jp->value++; jp->next[0]=head->next[0]; head->next[0]=jp;}} else{if(jn){ip=new Point(i); total++; ip->next[0]=head->next[0]; head->next[0]=ip; ip->next[1]=jp; ip->used++; jp->value++;} else{ip=new Point(i); jp=new Point(j); total+=2; ip->next[0]=jp; ip->next[1]=jp; jp->value++; ip->used++; jp->next[0]=head->next[0]; head->next[0]=ip; } }}HEAD=head;} void fun1(Point* p,int size_); char a[arraysizemax];void TP(Point* head,int size) { Point* p=head,*q=p;for(int i=0;i<size;i++,p=q,q=q->next[0]) if(q->value==0) fun1(q,size);} void fun1(Point* g,int size) {int t;Point* headt=new Point(g->name);Point* p=headt;Point* end;headt->next[0]=headt; for(t=1;t<size;t++) {g=g->next[0]; Point* k=new Point(g->name); p->next[0]=k; k->next[0]=headt; p=p->next[0]; } g=g->next[0]; end=p; p=headt; for(t=0;t<size;t++) { p->used=g->used; for(int tt=1;tt<=g->used;tt++) {Point* po=headt; for(int jj=0;jj<size;jj++) {if(po->name==g->next[tt]->name) break; po=po->next[0]; } p->next[tt]=po; po->value++; } p=p->next[0];g=g->next[0]; } int i=headt->used; for(int j=1;j<=i;j++) headt->next[j]->value--; a[total-size]=headt->name; end->next[0]=headt->next[0]; delete headt; if(size>1){headt=end->next[0]; TP(headt,size-1);} else{ for(int i=0;i<total;i++) cout<<a[i];cout<<endl;return;} }void main() {Initial();TP(HEAD,total);}

评论