图的算法问题——输出图中的环

来源:互联网 发布:java和javaweb哪个好 编辑:程序博客网 时间:2024/05/20 10:20

Using DFS to solvethe following problems:

  (1) given a graph G, test if G is connected.

  (2) given a graph G, test if G has a cycle,ifso,print a cycle

#include <iostream>#include <fstream>#include <string>#include <cstdlib>#define MAXSIZE 20#define MAX_QUEUE_SIZE 10using namespace std;int Map[MAXSIZE][MAXSIZE];int largest=0;int visited[MAXSIZE];//The function of reading a graph.void ReadGraph(){    ifstream fin("graph.txt");    const int LINE_LENGTH = 100;    char str[LINE_LENGTH];      while( fin.getline(str,LINE_LENGTH) )    {            int i,j,k;        i=(int)(str[0]-'0');        j=(int)(str[2]-'0');        Map[i][j]=1;        Map[j][i]=1;        k=(i>=j)?i:j;        largest=(largest>=k)?largest:k;    }}//The function of Printing.void PrintGraph(){     cout<<"The printing of the graph."<<endl;     for(int i=1;i<=largest;i++)     {        cout<<i<<"---";         for(int j=1;j<=largest;j++)         {             if(Map[i][j])             cout<<j<<",";         }                  cout<<endl;     }}//The function DFS.void DFS(int v){     cout<<v<<"->";     visited[v]=1;     for(int j=1;j<=largest;j++)     if(Map[v][j]&&!visited[j])     DFS(j);    }//The function to output the circle of a graph.void PrintCycle(){     int Queue[MAX_QUEUE_SIZE];    //Define a Queue which expressed in array.     int next;                     //The next node.     int front=0;     int rear=0;               //Definition of front and rear     int number=0;     for(int i=1;i<=largest;i++)     {        for(int j=1;j<=largest;j++)        {            if(Map[i][j])            number++;        }        if(number<=1)        {            for(int j=1;j<=largest;j++)            {               Map[i][j]=0;               Map[j][i]=0;            }        }        else        {            Queue[rear]=i;            rear=(rear+1)%MAX_QUEUE_SIZE;        }        number=0;     }     while(front!=rear)     {        int next;        next=Queue[front];        front=(front+1)%MAX_QUEUE_SIZE;        for(int j=1;j<=largest;j++)        {        if(Map[next][j])        number++;        }        if(number<=1)        {             for(int j=1;j<=largest;j++)             {                 Map[next][j]=0;                 Map[j][next]=0;               }        }     }     cout<<"The Cycle is :"<<endl;     rear=front=0;     for(int i=1;i<=largest;i++)     {        number=0;        for(int j=1;j<=largest;j++)        {        if(Map[i][j])        number++;        }        if(number)        {        Queue[rear]=i;        rear=(rear+1)%MAX_QUEUE_SIZE;        }       }     if(rear==0)     cout<<"The graph has no Cycle.";     else     while((front!=rear)&&(visited[front]==0))     {        int first;        first=Queue[front];        DFS(Queue[front]);        front=(front+1)%MAX_QUEUE_SIZE;        cout<<first;     }}int main(){    ReadGraph();    PrintGraph();    PrintCycle();    system("PAUSE");    return 0;}


原创粉丝点击