很多多餘的程式碼

因為懶得改又得趕著交作業

留下來以後就可以慢慢改了


#include <iostream>

using std::cout;
using std::cin;
using std::endl;

#include <cmath>
#include <ctime>

#define MAX 100
#define white 0
#define black 1


// structure definition
struct Node {   
   long id;
   long value;
}; // end struct Time


void createAdjList( Node **Adj, long numberOfNodes, long degree[] );
int fordfulkerson( Node **Adj, long numberOfNodes, long degree[], long maxflow,long COLOR[],long pi[],long d[],long Q[] );
bool BFS( Node **Adj, long numberOfNodes,long degree[],long COLOR[],long pi[],long d[],long Q[]);
//void printAdjList(Node **Adj,long numberOfNodes,long  pi[] ,long  d[] ,long degree[]);

long flow[MAX][MAX];
long capacity[MAX][MAX];

int main()
{
/*while(1)
{////*////
 long numberOfNodes,maxflow;
 long time1, time2;

 srand( time(0) );

 do {
  cout << "How many nodes( nodes at least 10 )? ";
  cin >> numberOfNodes;
 } while( numberOfNodes <= 2);
 cout << endl;

 time1 = time(0);

 long *degree = new long[ numberOfNodes + 1 ];
 long *d = new long[ numberOfNodes + 1 ];
// long *color = new long[ numberOfNodes + 1 ];
 long *pi = new long[ numberOfNodes + 1 ];
 long *Q = new long[numberOfNodes + 1 ];
 long *COLOR = new long[numberOfNodes+1];


// Node **Adj = new Node*[ numberOfNodes + 1 ];
 Node **Adj;
 Adj = new Node*[ numberOfNodes + 1 ];

 maxflow = 0;

 createAdjList( Adj, numberOfNodes, degree );

// BFS( Adj,numberOfNodes,degree,COLOR,pi,d,Q );
 
 //fordfulkerson( Adj,numberOfNodes,degree,maxflow,COLOR,pi,d,Q);

 cout<<endl<<"Max-Flow: "<<fordfulkerson( Adj,numberOfNodes,degree,maxflow,COLOR,pi,d,Q)<<endl;


// printAdjList(Adj, numberOfNodes,  pi ,  d ,degree);
 cout<<endl;
 time2 = time(0);
 cout << time2 - time1 << " seconds" << endl << endl;

 


 delete [] degree;
 delete [] pi;
 for( long i = 1; i <= numberOfNodes; i++ )
  delete [] Adj[i];
 delete [] Adj;
//}/////////
 /*char ch;
 cout << "Press any key to continue";
 ch = cin.get();
 ch = cin.get();*/
 system("pause");

 

 return 0; 

} // end main

void DFSVISIT(Node **Adj, long numberOfNodes,Node color[],long u,long degree[])
{
 color[u].value = 1;
 for(long i = 1;i<=degree[u];i++)
 {
  if( color[Adj[u][i].id].value == 0 )
   DFSVISIT(Adj,numberOfNodes,color,Adj[u][i].id,degree);
 }
}

void DFS(Node **Adj, long numberOfNodes,Node color[],long degree[])
{

 for(long i = 1;i<=numberOfNodes;i++)
  color[i].value = 0;

  if( color[1].value == 0 )
   DFSVISIT(Adj,numberOfNodes,color,1,degree);
 
}

void createAdjList( Node **Adj, long numberOfNodes, long degree[] )
{
 long i,j,k,p,realdegree;
 long numberOfEdges = 0;
// long degreeUpperBound = static_cast<long>(log10(numberOfNodes));
 long degreeUpperBound = static_cast<long>(sqrt(numberOfNodes));
 long *array = new long[numberOfNodes + 1 ];
 Node *color = new Node[numberOfNodes + 1 ]; 


 srand( time(0) );

 for( i = 1; i <= numberOfNodes; i++ ) {
  degree[i] = rand() % degreeUpperBound + 1;
  realdegree = degree[1];
  numberOfEdges += degree[i];
  
 }

// cout << "\nThe graph has " << numberOfEdges << " edges.\n";


 for(i = 1;i<=numberOfNodes;i++)
 {
  array[i] = i;
 }
 Adj[1] = new Node[numberOfNodes + 1];


 for( i = 1; i <= numberOfNodes; i++ )
 {

  if( i>1 )
  Adj[i] = new Node[ degree[i] + 1 ];

  p = numberOfNodes;
   
   //cout<<i<<"-> ";
   for( j = 1; j <= degree[i] ; j++)
   {
     
    k = rand() % p + 1;

    while(i==k)
    {
     k = rand() % p + 1;
    }

    Adj[i][j].id = array[k];

    if( k!=p )
    {
     if( p==i )
     {
      array[k] = array[p-1];
      p--;
     }
     else
     array[k] = array[p];
    }
    p--;

   // Adj[i][j].weight = rand() % weightUpperBound + 1; //放入weight arrary亂數值 且不超過weightUpperBound
    

   // cout<<" ("<<Adj[i][j].id<<" , "<<Adj[i][j].weight<<")";
   

   }

   //cout<<endl;
   for(long k = 1;k<=numberOfNodes;k++)
   {
    array[k] = k;
   }


  
 }

 DFS(Adj,numberOfNodes,color,degree);

 for(long s = 1;s<=numberOfNodes;s++)
 {
  if( color[s].value == 0 )
  {
   realdegree++;
   Adj[1][realdegree].id = s;
   //Adj[1][realdegree].weight = rand() % weightUpperBound + 1;
  }
 }
 degree[1] = realdegree;

 /*for( i = 1; i <= numberOfNodes; i++ )
 {
  cout<<i<<"-> ";

  for( j = 1; j <= degree[i]; j++)
  {
   cout<<" ("<<Adj[i][j].id<<" , "<<Adj[i][j].weight<<")";
  }
  cout<<endl;

 }*/
 

   
}

void Enqueue( long Q[], long s ,long &tail ,long numberOfNodes)
{
 Q[tail] = s;

 if( tail == numberOfNodes )
  tail = 1;
 else
  tail++;

}

int Dequeue( long Q[],long &head, long numberOfNodes )
{
 long s;

 s = Q[head];
 
 if( head == numberOfNodes )
  head = 1;
 else
  head++;

 return s;
}

bool BFS( Node **Adj, long numberOfNodes,long degree[],long COLOR[],long pi[],long d[],long Q[])
{

 long s,tail,head,u,i,j,v;

 tail = 1;
 head = 1;
 s = 1;

 for( i = 1;i<=numberOfNodes;i++)
 {
  for(j = 1;j<=degree[i];j++)
  {
   COLOR[Adj[i][j].id] = white;
  }
 }
 
 d[s] = 0;
 pi[s] = 0;
 COLOR[s] = black;
 Enqueue(Q,s,tail,numberOfNodes);

 while( head != tail )
 {
  u = Dequeue(Q,head,numberOfNodes);

  for(v=1;v<=degree[u];v++)
  {
   if( COLOR[Adj[u][v].id] == white && capacity[u][Adj[u][v].id]-flow[u][Adj[u][v].id]>0 )
   {
    COLOR[Adj[u][v].id] = black;
    d[Adj[u][v].id] = d[u] + 1;
    pi[Adj[u][v].id] = u;
    Enqueue(Q,Adj[u][v].id,tail,numberOfNodes);
   }
  }
 }

 if( COLOR[numberOfNodes]==black )
  return true;
 else
  return false;

}

int min( int a , int b )
{
 return a<b ? a:b;
}

int fordfulkerson( Node **Adj, long numberOfNodes, long degree[], long maxflow,long COLOR[],long pi[],long d[],long Q[])
{
 int i,j,cf,u,capacityUpperBound;


 capacityUpperBound = 30;
 cf = 100000;

 for(i = 1;i<=numberOfNodes;i++)
 {
  for(j=1;j<=degree[i];j++)
  {
   capacity[i][Adj[i][j].id] = rand() % capacityUpperBound + 1;
   flow[i][Adj[i][j].id] = 0;
   flow[Adj[i][j].id][i] = 0;
  }
 }

 for( i = 1; i <= numberOfNodes; i++ )
 {
  cout<<i<<"-> ";

  for( j = 1; j <= degree[i]; j++)
  {
   cout<<" ("<<Adj[i][j].id<<" , "<<capacity[i][Adj[i][j].id]<<")";
  }
  cout<<endl;

 }

 

 while( BFS(Adj,numberOfNodes,degree,COLOR,pi,d,Q) )
 {
  u = numberOfNodes;
  do
  {
   cf = min( cf , capacity[pi[u]][u]-flow[pi[u]][u]);
   u = pi[u];
  }while( pi[u] > 0 );

  u = numberOfNodes;

  do
  {
   flow[pi[u]][u] += cf;
   flow[u][pi[u]] -= cf;
   u = pi[u];
  }while( pi[u] > 0 );

  maxflow+=cf;
 }

 return maxflow;
}

 


/////////////////       for BFS test!!         ////////////////////////////////////////////
/*void printAdjList(Node **Adj,long numberOfNodes,long  pi[] ,long  d[] ,long degree[])
{
 cout<<endl<<"d :"<<endl;
 for( int i = 1;i<=numberOfNodes;i++ )
 {
  cout<<"d["<<i<<"] = "<<d[i]<<endl;
 }

 cout<<endl<<"parent :"<<endl;

 for(int j = 1;j<=numberOfNodes;j++)
 {
  cout<<"pi["<<j<<"] = "<<pi[j]<<endl;
 }
}*/

 

 

arrow
arrow
    全站熱搜

    flyinsky76 發表在 痞客邦 留言(0) 人氣()