sdut 2140 有向图中是否存在拓扑序列的判断
生活随笔
收集整理的這篇文章主要介紹了
sdut 2140 有向图中是否存在拓扑序列的判断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description
?給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。
講解:http://blog.csdn.net/dm_vincent/article/details/7714519
? ? ? ? ??http://baike.sogou.com/v1486429.htm?fromTitle=拓撲排序#title
?http://www.cnblogs.com/Braveliu/archive/2013/12/05/3460232.html#top
Input
?輸入包含多組,每組格式如下。
第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10)
后面m行每行兩個整數a b,表示從a到b有一條有向邊。
?
Output
?若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。
?
Example Input
1 0 2 2 1 2 2 1Example Output
YES NO#include <bits/stdc++.h> using namespace std; int edge[15][15],indegree[15]; int n,m; int topo() {int ans=0;for(int t=0;t<n;++t)//網上出現的這個循環的意義很奇妙,思考不出來的話就把這個循環去掉,看看程序走的時候會發生什么結果(也可以寫成下面的方式){for(int i=1;i<=n;++i){if(!indegree[i]){indegree[i]=-1;ans++;for(int j=1;j<=n;++j){if(edge[i][j])indegree[j]--;}break;}}}return ans; } int main() {int a,b;while(cin>>n>>m){memset(edge,0,sizeof(edge));memset(indegree,0,sizeof(indegree));for(int i=0;i<m;++i){cin>>a>>b;edge[a][b]=1;indegree[b]++;}if(topo()==n)cout<<"YES"<<endl;elsecout<<"NO"<<endl;} }int topo() {int ans=0;//能夠構成拓撲序列的頂點數for(int i=1;i<=n;i++){if(!indegree[i])//尋找入度為0的頂點{g.indegree[i]=-1;//刪除該點ans++;for(int j=1;j<=n;j++){if(g.ma[i][j]==1)//刪除該頂點的所有出邊{g.indegree[j]--;}}}}return ans; }還有一種基于DFS的方法(好吧,暫時沒有領悟到)#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> using namespace std; int vis[11]; int m,n,u,v; int map[11][11]; int dfs(int u) {vis[u]=-1;//正在訪問for(v=1; v<=m; v++){if(map[u][v]){if(vis[v]<0)return 0;//去掉自環else if(!vis[v]&&!dfs(v))//v元素還沒有被訪問而且v的后繼元素和前面的正在訪問的元素構成了回路(構成的回路不是自回路的情況)。return 0;}}vis[u]=1;return 1;} int toposort() {for(u=1; u<=m; u++){if(!vis[u]){if(!dfs(u))return 0;}}return 1;} int main() {while(~scanf("%d %d",&m,&n)&&(m+n!=0)){memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));for(int i=0; i<=n-1; i++){scanf("%d %d",&u,&v);map[u][v]=1;}if(toposort())cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0; }
總結
以上是生活随笔為你收集整理的sdut 2140 有向图中是否存在拓扑序列的判断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdut 2506 完美网络(优先队列)
- 下一篇: sdut 2141 BFS(用邻接矩阵和