Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

fishing net problem of zoj 1015 how to implement lexbfs to generate a peo

Posted by zghenry at 2009-03-19 02:10:31
how to implement lexbfs to generate a peo

Postby zghenry on Wed, Jul 23, 2008 06:15
if i change the lexbfs2 to mcs this is a correct code for 1015.however it does not work for lexbfs2.
by the book there are two ways of rendering peo one is mcs(max cardinality set) the other is lexbfs (lexicographic broad first search)
but I can not get code accepted when I wrote lexbfs.This problem has been puzzling me for two month any one can give some suggestion?

Code: Select all
    #pragma warning(disable: 4786)
    #include "stdafx.h"
    //#include <stdio.h>
    #include <list>
    using namespace std;
    typedef list<int> listinttype;
    listinttype connectgraph[2001];
    bool connectarray[2001][2001];
    int sortedorder[2001];
    /*********************************************
              lexbfs2
    *********************************************/

    inline void lexbfs2(int numofvertex)
    {
       int visited[2001];
       list<listinttype> Qlist;
       list<int> bucket;
       list<int> flaglist;
       list<int>::iterator Qiter;
       list<int>::iterator flagiter;
       list<int>::iterator tempflagl;
       list<int>::iterator flagl[2001];
       list<int>::iterator vl[2001];
       list<listinttype>::iterator vlayer[2001];
       int i;

       for(i=1;i<=numofvertex;i++)
          visited[i]=0;
       
        for(i=1;i<=numofvertex;i++)
          bucket.push_front(i);
       
       Qlist.push_back(bucket);
       flaglist.push_back(0);
       
        Qiter=Qlist.begin()->end();
       Qiter--;
       for(i=1;i<=numofvertex;i++)
       {
          vl[i]=Qiter;
          vlayer[i]=Qlist.begin();
          flagl[i]=flaglist.begin();
          if(i!=numofvertex)
             Qiter--;
       }
       
       
       list<int>::iterator connectgraphiter;
       list<listinttype>::iterator Qlayeriter;
       

       

       int biggest;
       int tempnumofvertex;

       
       tempnumofvertex=numofvertex;
       
       while(tempnumofvertex--)
       {
          Qlayeriter=Qlist.begin();
          biggest=*(Qlayeriter->begin());
          sortedorder[numofvertex-tempnumofvertex]=biggest;
          visited[biggest]=1;
          Qlayeriter->pop_front();
          
          if(Qlayeriter->size()==0)
          {
             Qlist.erase(Qlayeriter);
             flaglist.erase(flagl[biggest]);
          }

          
          for(connectgraphiter=connectgraph[biggest].begin();connectgraphiter!=connectgraph[biggest].end();connectgraphiter++)
          {
             if(visited[*connectgraphiter])
                continue;
             Qiter=vl[*connectgraphiter];
             Qlayeriter=vlayer[*connectgraphiter];
             Qlayeriter->erase(Qiter);
             
              if(*flagl[*connectgraphiter]==1)
             {
                Qlayeriter--;
                Qiter=Qlayeriter->begin();
                Qlayeriter->insert(Qiter,*connectgraphiter);

                Qiter--;
                vl[*connectgraphiter]=Qiter;
                vlayer[*connectgraphiter]=Qlayeriter;
             }
             else
             {
                bucket.clear();
                bucket.push_front(*connectgraphiter);
                Qlist.insert(Qlayeriter,bucket);

                Qlayeriter--;
                Qiter=Qlayeriter->begin();
                vl[*connectgraphiter]=Qiter;
                vlayer[*connectgraphiter]=Qlayeriter;

                *flagl[*connectgraphiter]=1;
                flaglist.insert(flagl[*connectgraphiter],0);
                
             }
             tempflagl=flagl[*connectgraphiter];
             flagl[*connectgraphiter]--;
             Qlayeriter++;
             if(Qlayeriter->size()==0)
             {
                Qlist.erase(Qlayeriter);
                flaglist.erase(tempflagl);
             }
          }
          for(flagiter=flaglist.begin();flagiter!=flaglist.end();flagiter++)
             if(*flagiter==1)
                *flagiter=0;         
       
       }
    }
    inline bool checkpeo(int numofvertex)//perfecteliminationorder
    {
       list<int>::iterator iter;
       int max;
       
       for(int i=numofvertex;i>=1;i--)
       {
          int flag=0;
          for(iter=connectgraph[i].begin();iter!=connectgraph[i].end();iter++)
             if(sortedorder[*iter]<sortedorder[i])
             {
                if(flag==0)
                {
                   max=*iter;
                   flag=1;
                }
                else if(sortedorder[max]<sortedorder[*iter])
                   max=*iter;
             }
          if(flag==0)
             continue;
          for(iter=connectgraph[i].begin();iter!=connectgraph[i].end();iter++)
             if(max!=*iter&&sortedorder[*iter]<sortedorder[i]&&!connectarray[*iter][max])
                return 0;
       }
       return 1;
    }

    int main()
    {
       int numofvertex,numofedge;
       int fromnode,tonode;
       int i,j;
       
       while(scanf("%d %d",&numofvertex,&numofedge)&&numofvertex!=0&&numofedge!=0)
       {
          
          for(i=1;i<=numofvertex;i++)
             connectgraph[i].clear();

          for(i=1;i<=numofvertex;i++)
             for(j=1;j<=numofvertex;j++)
                connectarray[i][j]=0;
          
          while(numofedge--)
          {
             scanf("%d %d",&fromnode,&tonode);
             connectgraph[fromnode].push_back(tonode);
             connectgraph[tonode].push_back(fromnode);
             connectarray[fromnode][tonode]=1;
             connectarray[tonode][fromnode]=1;
          }

          mcs(numofvertex);
          if(!checkpeo(numofvertex))
             printf("Imperfect\n\n");
          else
             printf("Perfect\n\n");
       }
       return 0;
    }



    /*********************************************
             MCS
    *********************************************/
    /*
    bool Used[2001];
    int Set1[2001];
    void mcs(int n)
    {
       int id,i,j,Max,MaxValue;
       int Link[2001];
       for(int i=1;i<=2000;i++)
       {
          Used[i]=false;
          Set1[i]=0;
       }
        Set1[n]=1;
       Used[1]=true;
       for(id=n-1;id>=1;id--)
       {
          for(i=1;i<=n;i++)
             Link[i]=0;
          for(i=1;i<=n;i++)
          {
             if(Used[i]==false)
             {
                for(j=1;j<=n-id;j++)
                {
                   if(connectarray[i][Set1[n-j+1]]==true)
                      Link[i]++;
                }
             }
          }
          MaxValue=0;
          for(i=1;i<=n;i++)
             if(Link[i]>MaxValue)
             {
                MaxValue=Link[i];
                Max=i;
             }
          Set1[id]=Max;Used[Max]=true;

       }
       for(i=1;i<=n;i++)
          sortedorder[i]=Set1[n-i+1];   
    }
    */

[/code]

zghenry
    Newbie
     
    Posts: 1
    Joined: Wed, Jul 23, 2008 06:05

Top

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator