• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-48  評論-259  文章-1  trackbacks-0

            #include "iostream.h"
            #include "fstream.h"
            #include "SqStack.h"
            #include "stdlib.h"


            #define MAX 100000
            #define  MAX_VERTEX_NUM 20     
            typedef enum  {DG,DN,UDG,UDN} GraphKind;
            typedef char VertexType;   
            typedef struct {                                
             VertexType vexs[MAX_VERTEX_NUM];                      
             int        arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];   
             int        vexnum,arcnum;                                      
             GraphKind  kind;                           
            } MGraph;

            int LocateVex(MGraph G,VertexType u)
            {
              for(int i=0;i<G.vexnum&&G.vexs[i]!=u;i++);
              if(i==G.vexnum) return FALSE;
              else return i;
            }
            Status CreateGraph(MGraph &G)
            {
              int n;
              cout<<" 0. 有向圖  1. 有向網、 "<<endl;
              cout<<" 2. 無向圖  3. 無向網   "<<endl; 
              cout<<"輸入你要建立的圖的類型:"<<endl;
              cin>>n;
              ifstream istrm;
              switch(n)
              {
              case 0:G.kind=DG;istrm.open("DGraph.txt");break;
              case 1:G.kind=DN;istrm.open("DNet.txt");break;
              case 2:G.kind=UDG;istrm.open("UDGraph.txt");break;
              case 3:G.kind=UDN;istrm.open("UDNet.txt");break;
              }
              istrm>>G.vexnum>>G.arcnum;
              int i,j,k,w;
              VertexType v1,v2;
              for(i=0;i<G.vexnum;i++) istrm>>G.vexs[i];
              if(n%2)
              {
                for(i=0;i<G.arcnum;i++)
              for(j=0;j<G.vexnum;j++)
               G.arcs[i][j]=MAX;
             for(k=0;k<G.arcnum;k++)
             { 
              istrm>>v1>>v2>>w;
              i=LocateVex(G,v1);
                    j=LocateVex(G,v2);
              G.arcs[i][j]=w;
              if(n/2) G.arcs[j][i]=w;
             }

              }
              else
              {
                for(i=0;i<G.arcnum;i++)
              for(j=0;j<G.vexnum;j++)
               G.arcs[i][j]=0;
             for(k=0;k<G.arcnum;k++)
             { 
              istrm>>v1>>v2;
              i=LocateVex(G,v1);
                    j=LocateVex(G,v2);
              G.arcs[i][j]=1;
              if(n/2) G.arcs[j][i]=1;
             }

              }
              return OK;
            }
            void OutPut(MGraph G)
            {
              cout<<"該圖為";
              switch(G.kind)
              {
              case DG:cout<<"有向圖"<<endl;break;
              case DN:cout<<"有向網"<<endl;break;
              case UDG:cout<<"無向圖"<<endl;break;
              case UDN:cout<<"無向網"<<endl;break;
              }
              cout<<"頂點個數為"<<G.vexnum<<endl;
              cout<<"邊的條數為"<<G.arcnum<<endl;
              int i,j;
              if(G.kind/2)
              {
               for(i=0;i<G.vexnum;i++)
                     for(j=0;j<i;j++)
               {
                if(G.arcs[i][j]!=0&&G.arcs[i][j]!=MAX)
                {
                 cout<<G.vexs[i]<<" "<<G.vexs[j];
                 if(G.kind%2) cout<<" "<<G.arcs[i][j];
                 cout<<endl;
                }
               }
              }
              else
              {
                for(i=0;i<G.vexnum;i++)
                     for(j=0;j<G.vexnum;j++)
               {
                if(G.arcs[i][j]!=0&&G.arcs[i][j]!=MAX)
                {
                 cout<<G.vexs[i]<<" "<<G.vexs[j];
                 if(G.kind%2) cout<<" "<<G.arcs[i][j];
                 cout<<endl;
                }
               }
              }
            }
            void DFSTraverse(MGraph G)
            {
              int visited[MAX_VERTEX_NUM],i;
              for(i=0;i<G.vexnum;i++)
               visited[i]=0;
              for(i=0;i<G.vexnum;i++)
              {
                if(!visited[i]) continue;
             visited[i]=1;
             cout<<G.vexs[i]<<" ";
              }
            }
            void MiniTree_PRIM(MGraph G,VertexType u)
            {
              struct{
                   VertexType adjvex;
                   int lowcost;
              }closedge[MAX_VERTEX_NUM];
              int k=LocateVex(G,u);
              int i,j,min;
              for(j=0;j<G.vexnum;j++)
               if(j!=k) {closedge[j].adjvex=u;closedge[j].lowcost=G.arcs[k][j];}
              closedge[k].lowcost=0;
              cout<<"最小生成樹為"<<endl;
              for(i=1;i<G.vexnum;i++)
              { min=MAX;
                for(j=0;j<G.vexnum;j++)
             {   if(closedge[j].lowcost)
                if(closedge[j].lowcost<min) {k=j;min=closedge[j].lowcost;}
             }
             cout<<closedge[k].adjvex<<" "<<G.vexs[k]<<endl;
             closedge[k].lowcost=0;
             for(j=0;j<G.vexnum;j++)
              if(G.arcs[k][j]<closedge[j].lowcost)
              {
               closedge[j].adjvex=G.vexs[k];
               closedge[j].lowcost=G.arcs[k][j];
              }
              }
            }
            Status TopoSort(MGraph G)
            {
              cout<<"拓撲排序序列為";
              int indegree[MAX_VERTEX_NUM]={0};
              int i,j;
              VertexType e;
              for(i=0;i<G.vexnum;i++)//FindInDegree
               for(j=0;j<G.vexnum;j++)
               {
                 if(G.arcs[j][i]) indegree[i]++;
               }
              SqStack S;
              InitStack(S);
              for(i=0;i<G.vexnum;i++)
              {
               if(!indegree[i]) {Push(S,G.vexs[i]);}
              }
              int count=0;
              //ofstream ostrm;
              //ostrm.open("TopoOrder.txt");
              while(!StackEmpty(S))
              {
                Pop(S,e);
             cout<<e<<" ";count++;
            // ostrm<<e<<" ";
             i=LocateVex(G,e);
             for(j=0;j<G.vexnum;j++)
             {
              if(G.arcs[i][j])
              { 
               if(!(--indegree[j])) Push(S,G.vexs[j]);
              }
              
             }
              }

              if(count<G.vexnum) return ERROR;
              else return OK;
              cout<<endl;
            }

            Status TopoOrder(MGraph G,SqStack &T,int ve[])
            {
              int indegree[MAX_VERTEX_NUM]={0};
              int i,j;
              VertexType e;
              for(i=0;i<G.vexnum;i++)//FindInDegree
               for(j=0;j<G.vexnum;j++)
               {
                 if(G.arcs[j][i]!=MAX) indegree[i]++;
               }
              SqStack S;
              InitStack(S);
              for(i=0;i<G.vexnum;i++)
              {
               if(!indegree[i]) {Push(S,G.vexs[i]);}
              }
              int count=0;
              for(i=0;i<G.vexnum;i++)
               ve[i]=0;
              //ofstream ostrm;
              //ostrm.open("TopoOrder.txt");
              while(!StackEmpty(S))
              {
                Pop(S,e);Push(T,e);
                count++;
            // ostrm<<e<<" ";
             i=LocateVex(G,e);
             for(j=0;j<G.vexnum;j++)
             {
              if(G.arcs[i][j]!=MAX)
              { 
               if(!(--indegree[j])) Push(S,G.vexs[j]);
               if(ve[i]+G.arcs[i][j]>ve[j]) {ve[j]=ve[i]+G.arcs[i][j];}
               
              }
              
             }
              }
               
              if(count<G.vexnum) return ERROR;
              else return OK;
              cout<<endl;
            }
            Status CriticalPath(MGraph G)
            {
              SqStack T;
              InitStack(T);
              int i,j,k;
              int ee,el;
              int ve[MAX_VERTEX_NUM],vl[MAX_VERTEX_NUM];
              VertexType e;
              if(!TopoOrder(G,T,ve)) return ERROR;
             
              for(i=0;i<G.vexnum;i++)  vl[i]=ve[G.vexnum-1];
              while(!StackEmpty(T))
              {
                Pop(T,e);k=LocateVex(G,e);
             for(j=0;j<G.vexnum;j++)
             {
                  if(G.arcs[k][j]!=MAX) 
                if(vl[j]-G.arcs[k][j]<vl[k]) vl[k]=vl[j]-G.arcs[k][j];
             }
              }
              //for(i=0;i<G.vexnum;i++) cout<<" "<<vl[i];exit(1);
              for(i=0;i<G.vexnum;i++)
               for(j=0;j<G.vexnum;j++)
                 if(G.arcs[i][j]!=MAX)
              {
                ee=ve[i];el=vl[j]-G.arcs[i][j];
                char tag=(ee==el)?'*':'+';
                cout<<G.vexs[i]<<" "<<G.vexs[j]<<" "<<G.arcs[i][j]<<" "<<tag<<endl;
              }
               return OK;
              
            }
            void ShortestPath_DIJ(MGraph G,VertexType u)
            {
              int v0=LocateVex(G,u);
              bool final[MAX_VERTEX_NUM];
              int P[MAX_VERTEX_NUM],D[MAX_VERTEX_NUM];
              int i,j,min,v;
              for(i=0;i<G.vexnum;i++)
              {
               final[i]=FALSE;D[i]=G.arcs[v0][i];
               if(G.arcs[v0][i]!=MAX) P[i]=v0;
               else P[i]=MAX;
              }
              final[v0]=TRUE;
              P[v0]=v0;
              D[v0]=0;
              for(i=1;i<G.vexnum;i++)
              {
                min=MAX;
             for(j=0;j<G.vexnum;j++)
              if(!final[j])
               if(D[j]<min) {v=j;min=D[j];}
             final[v]=TRUE;
             for(j=0;j<G.vexnum;j++)
              if(!final[j]&&(min+G.arcs[v][j]<D[j]))
              {
                D[j]=min+G.arcs[v][j];
                P[j]=v;
              }//if
              }//for
              for(i=0;i<G.vexnum;i++)
              {
                cout<<G.vexs[i]<<" ";
             j=i;
             while(j!=v0)
             {
               j=P[j];
               cout<<G.vexs[j]<<" ";
              
             }
             cout<<D[i]<<endl;
              }
            }//DIJ

             

            posted on 2007-06-15 10:13 星夢情緣 閱讀(1826) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構的所有實現程序程序設計題目
            精品免费久久久久国产一区| 久久夜色精品国产噜噜亚洲AV| 亚洲婷婷国产精品电影人久久| 久久久久亚洲精品日久生情| 狠狠色综合网站久久久久久久 | 亚洲Av无码国产情品久久| 亚洲国产欧洲综合997久久| 青青热久久国产久精品 | 久久精品国产亚洲AV无码麻豆| 色偷偷888欧美精品久久久| 久久er热视频在这里精品| 亚洲va久久久噜噜噜久久天堂| 日韩AV无码久久一区二区 | 亚洲AV无码成人网站久久精品大| 国产精品熟女福利久久AV| 午夜精品久久久久久久| 久久久久AV综合网成人| 人妻精品久久久久中文字幕一冢本| 久久久久久国产精品免费无码 | 久久精品一区二区影院| 久久91精品久久91综合| 国产精品欧美久久久久天天影视| 97久久精品国产精品青草| 天天久久狠狠色综合| 久久777国产线看观看精品| 久久93精品国产91久久综合| 久久精品国产99久久丝袜| 国产69精品久久久久APP下载| 看全色黄大色大片免费久久久| 久久精品国产亚洲AV不卡| 久久无码专区国产精品发布| 国产欧美一区二区久久| 99久久精品国产麻豆| 亚洲国产精品嫩草影院久久| 思思久久好好热精品国产| 亚洲国产精品久久久久久| 久久久久一级精品亚洲国产成人综合AV区 | 国内精品伊人久久久影院| 亚洲国产成人精品久久久国产成人一区二区三区综 | 办公室久久精品| 亚洲国产高清精品线久久 |