圖中是否有環-->拓撲排序
阿新 • • 發佈:2019-01-07
圖結構練習——判斷給定圖是否存在合法拓撲序列
Time Limit: 1000ms Memory limit: 65536K 有疑問?點這裡^_^
題目描述
給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。
輸入
輸入包含多組,每組格式如下。
第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10)
後面m行每行兩個整數a b,表示從a到b有一條有向邊。
輸出
若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。
示例輸入
1 0
2 2
1 2
2 1
示例輸出
YES
NO
Time Limit: 1000ms Memory limit: 65536K 有疑問?點這裡^_^
題目描述
給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。
輸入
輸入包含多組,每組格式如下。
第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10)
後面m行每行兩個整數a b,表示從a到b有一條有向邊。
輸出
若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。
示例輸入
1 0
2 2
1 2
2 1
示例輸出
YES
NO
<pre name="code" class="cpp"># include <bits/stdc++.h> using namespace std; typedef struct node { int to;// u--->v的有向邊記錄點v struct node*next; } Node; Node*List[11]; int indegree[11]; int Stack[11];//入度為0的頂點入棧 void TopSort(int n,int m); int main() { int n,m,i; int a,b; Node *p; while(cin>>n>>m) { if(n == 0 && m == 0) { break; } memset(List,0,sizeof(List)); memset(indegree,0,sizeof(indegree)); while(m--) { //scanf("%d%d",&a,&b); cin>>a>>b; indegree[b]++; //頂點b入度加1 p = (Node*)malloc(sizeof(Node)); p->to = b; p->next = NULL; if(List[a] == NULL)//邊連結串列上沒有節點 { List[a] = p; } else//逆序建表 { /*注意開的是結構體指標陣列*/ p->next = List[a]; List[a] = p; } } TopSort(n,m); //釋放邊連結串列上各點 for(i=1;i<=n;i++) { p = List[i]; while(p!=NULL) { List[i] = p->next; free(p); p = List[i]; } } } } void TopSort(int n,int m) { int i,j,k; int top = -1; Node*tmp; bool bcycle = false;//是否存在有向環,初始認為沒有 for(i=1;i<=n;i++) { if(indegree[i] == 0) { Stack[++top] = i; } } for(i=1;i<=n;i++) { if(top == -1)//如果在頂點全部輸出之前棧頂指標top已變成了-1,表明棧已空.已經沒有入度為0的點了,說明存在有向環 { bcycle = true; break; } else { j = Stack[top--]; tmp = List[j]; //遍歷頂點j的邊連結串列,每條邊的終點入度減去1 while(tmp!=NULL) { k = tmp->to; if(--indegree[k] == 0)//入度為0進棧 { Stack[++top] = k; } tmp = tmp->next; } } } if(bcycle) { printf("NO\n"); } else { printf("YES\n"); } }