1. 程式人生 > >拓撲排序(判斷有向圖是否有迴路)

拓撲排序(判斷有向圖是否有迴路)

#include <iostream>  
#include <queue>  
#include <string>  
using namespace std;  
  
//表結點  
typedef struct ArcNode{  
    int adjvex;//該弧所指向的頂點的位置   
    ArcNode *nextarc;  
}ArcNode;  
  
//頭結點  
typedef struct VNode{  
    string data;//頂點資訊  
    ArcNode *firstarc;//第一個表結點的地址,指向第一條依附該頂點的弧的指標  
}VNode, AdjList[10];  
  
typedef struct ALGraph{  
    AdjList vertices;  
    int vexnum, arcnum;  
}ALGraph;  
  
int LocateVex(ALGraph G, string u)//返回頂點u在圖中的位置  
{  
    for(int i=0; i<G.vexnum; i++)  
        if(G.vertices[i].data==u)  
            return i;  
    return -1;  
}  
  
void CreateDG(ALGraph &G)//構造有向圖  
{  
    string v1, v2;  
    int i, j, k;  
    cout<<"請輸入頂點數和邊數:";  
    cin>>G.vexnum>>G.arcnum;  
  
    cout<<"請輸入頂點:";  
    for(i=0; i<G.vexnum; i++)  
    {  
        cin>>G.vertices[i].data;  
        G.vertices[i].firstarc=NULL;  
    }  
  
    cout<<"請輸入邊:"<<endl;  
    for(k=0; k<G.arcnum; k++)  
    {  
        cin>>v1>>v2;  
        i=LocateVex(G, v1);  
        j=LocateVex(G, v2);  
  
        ArcNode* arc=new ArcNode;  
        arc->adjvex=j;  
        arc->nextarc=G.vertices[i].firstarc;  
        G.vertices[i].firstarc=arc;  
    }  
}  
  
void FindIndegree(ALGraph G, int indegree[])//求頂點的入度  
{  
    for(int i=0; i<G.vexnum; i++)  
        indegree[i]=0;  
  
    for(i=0; i<G.vexnum; i++)  
    {  
        ArcNode *p=G.vertices[i].firstarc;  
        while(p)  
        {  
            indegree[p->adjvex]++;  
            p=p->nextarc;  
        }  
    }  
}  
  
void TopologicalSort(ALGraph G)//拓撲排序  
{  
    queue<int> q;  
    int indegree[10]={0};//入度陣列  
    int count=0;//計數,計入隊數  
  
    FindIndegree(G, indegree);  
  
    for(int i=0; i<G.vexnum; i++)//入度為0的頂點入隊  
        if(0==indegree[i])  
            q.push(i);  
      
    while(!q.empty())  
    {  
        int v=q.front();  
        q.pop();  
        count++;  
        cout<<G.vertices[v].data<<" ";  
        ArcNode *p=G.vertices[v].firstarc;  
        while(p)//出隊後,每個鄰接點入度減1  
        {  
            if(!(--indegree[p->adjvex]))  
                    q.push(p->adjvex);//入度為0的頂點入隊  
            p=p->nextarc;  
  
        }  
    }  
  
    if(count<G.vexnum)//由此判斷有向圖是否有迴路  
        cout<<"該有向圖有迴路"<<endl;  
}  
  
void main()  
{  
    ALGraph G;  
    CreateDG(G);  
  
    cout<<"拓撲排序:";  
    TopologicalSort(G);  
    cout<<endl;  
  
}  

測試用例一:

測試用例二:


相關推薦

排序判斷是否是無環

要進行拓撲排序之前,該圖要是有向無環圖。 排序方法: 1、從有向圖中選取一個沒有前驅的頂點,並輸出之 ;2、從有向圖中刪去此頂點以及所有以它為尾的弧; 3、重複上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。 #include<stdio.h>

排序判斷是否迴路

#include <iostream> #include <queue> #include <string> using namespace std; //表結點 typedef struct ArcNode{

排序 判斷是否完全,及序列

Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from sma

兩種方法判斷是否環【DFS】【排序

方法1:DFS判斷有向圖是否有環 對一個節點u進行DFS,判斷是否能從u回到自己這個節點,即是否存在u到u的迴路。 color陣列代表每個節點的狀態 -1代表還沒訪問,0代表正在被訪問,1代表訪問結束 如果一個狀態為0的節點,與它相連的節點狀態也為0,則有環

判斷是否存在迴路排序

#include <iostream> #include <string> #include <queue> using namespace std; typedef struct Edgenode { int adjvex; st

判斷是否環及排序

對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological O

判斷是否環之排序-LeetCode 207. Course Schedule

拓撲排序:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。 下圖是一個拓撲排序: 下圖不是一個拓撲排序:如何獲得

無環排序DFS實現

1.有向無環圖的拓撲排序 // enDegree表示每個頂點的入度,這個資料結構可以從圖的結構求出來 // graph是一個二維陣列,但是這個陣列不是圖的鄰接矩陣,graph[i][j]表示依賴於i的第

排序判斷是否正環負環無所謂

資料結構AOE網 和AOV-網一節    意義就是: 給出一些事件和活動 (圖),該事件進行的前提條件是,所有以該事件為後繼的活動已經完成(頂點進行的前提條件是,其作為後繼的邊全部完成) 給這些事件排個序,使得事件進行過程不衝突 如果衝突 &nb

Java實現排序:基於鄰接矩陣,針對無環

public void topoSort(){//僅僅針對有向圖,基本思路是找到一個無後繼的結點,將其刪除,並放到排序陣列的尾端,依次迴圈。直到沒有結點。 int originalVertex

HDU 4857 逃生排序逆向+鄰接表存

panel scrip topo %d tar ons back int queue 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 題目: Problem Description 糟糕的事情發生啦,現在大家都忙

排序鄰接表

#include <stdio.h> #include <stdlib.h> #define Max_Vertex_Num 100 #define STACK_SIZE 30 typedef struct ArcNode{ int adjvex; //此題用不到

論——排序C++實現

有向無環圖      如果一個有向圖的任意頂點都無法通過一些有向邊回到自身,那麼稱這個有向圖為有向無環圖。 拓撲排序      拓撲排序是將有向無環圖G的所有頂點排成一個線性序列,使得對圖G中的任

排序算法競賽入門經典劉汝佳

沒有 -1 nts adjacency lag 過大 content tail popu 轉載請註明出處:http://blog.csdn.net/u012860063?viewmode=contents 【分析】(小白) 把每一個變量看成

The Largest Clique UVA - 11324 最大團

while esp sta pan n) ace break ems using The Largest Clique UVA - 11324 題意:有向圖最大團。求任意兩點可達(不是互達)的最多點數。 先求出SCC,然後縮點,新圖就變成了一個DAG,每個點的權值為內點

排序程式碼理解

把程式碼段看完應該就可以了,網上的也挺多的; 我的程式碼已經夠容易理解的了; #include <iostream> #include <queue> #include<cstdio> #include <cstring> using n

排序字典序最小,字典序最小

E. Minimal Labels 題意: 給出 m 條有向邊,組成有向無環圖,輸出一個 1 到 n 組成的排列,每個數只能出現一次,表示每個點的標號。如果有邊 (u,v)(u,v) 那麼 labelu<labelvlabelu<labelv 。要求最後

判斷是否迴路四種方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

排序AOV網

#include <stdio.h> #include <stdlib.h> typedef struct node { int adjvex; struct node*next; }EdgeNode; typedef struct vnode { int

排序 TopSort

拓撲排序是DAG(無圈有向圖)引出的新概念,它是對DAG圖的頂點的一種排序。 如果圖中存在兩點 vi --> vj,拓撲排序保證排序結果,vj出現在vi後面。我們可以用這個特性來解決優先順序問題。 而且,如果這個圖有圈,我們的拓撲排序將會失敗。當然拓撲排序結果也並不唯一。 &n