拓撲排序(判斷有向圖是否有迴路)
#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