正文

全排序的拓扑算法2006-07-30 02:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/petibo/16990.html

分享到:

一般的拓扑算法只有一种输出,这个可以把所有的可能都输出^)^:#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);}

阅读(1001) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册