有向圖的拓撲序列:
給定乙個n個點m條邊的有向圖,點的編號是1到n,圖中可能存在重邊和自環。
請輸出任意乙個該有向圖的拓撲序列,如果拓撲序列不存在,則輸出-1。
若乙個由圖中所有點構成的序列a滿足:對於圖中的每條邊(x, y),x在a中都出現在y之前,則稱a是該圖的乙個拓撲序列。
輸入格式
第一行包含兩個整數n和m
接下來m行,每行包含兩個整數x和y,表示存在一條從點x到點y的有向邊(x, y)。
輸出格式
共一行,如果存在拓撲序列,則輸出任意乙個合法的拓撲序列即可。否則輸出-1。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define ull unsigned long long
#define up_b upper_bound
#define low_b lower_bound
#define m_p make_pair
#define mem(a) memset(a,0,sizeof(a))
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define endl "\n"
#include
using
namespace std;
inline ll read()
while
('0'
<=ch&&ch<=
'9') x=x*
10+ch-
'0', ch=
getchar()
;return f*x;
}const
int n =
1e5+5;
int n,m,in[n]
;struct nodeedge[n]
;int head[n]
,idx;
void
add(
int u,
int v)
; head[u]
=idx++;}
vector<
int> path;
bool
topo()
}return path.
size()
==n;
//如果最終入隊的點數不足n點,說明圖**現了環,不存在拓撲排序
}int
main()
if(topo()
)else cout<<-1
}
拓撲排序學習筆記
1.拓撲排序只對於有向無環圖而言 directed acyclic graph簡稱dag 2.在乙個有向無環圖中,若a b c,則拓撲序列為 a,b,c 也就是說如果一條邊a b,那麼在拓撲序列裡a就在b前面 知道了這兩點,那麼就可以來求拓撲序列了 首先,我們知道在dag中一定存在乙個入度為0的點,...
拓撲排序學習筆記
1.輸出字典序最小的拓撲序 在bfs演算法方法中用優先佇列 2.題意 n個點m條邊 dag 求刪去每個點後1 n最短路 n,m 3e5 做法 首先在dag中可以跑拓撲排序,跑完拓撲排序有什麼好處呢?拓撲序上的乙個點k作為劃分線,前半段的點的集合設為x,後半段點的集合設為y,那麼從點1到x中的任意乙個...
拓撲排序 學習筆記
今天,我們來聊聊拓撲排序。拓撲排序,這個顧名思義似乎有點難。那就直接上定義吧 啥意思呢。比如這樣乙個dag 幾種可能的拓撲序是 也就是說,dag的拓撲序可能並不唯一。那麼,1 3 2 4 5 6 7是不是這張圖的拓撲序呢?答案是否定的,因為圖中存在 2 rightarrow 3 這條邊,那麼2必須出...