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

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 10

using 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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值