很多圖論的算法都有一個函數
struct Edge { int to; int w; int next; } edge[N * 2]; int cnt_edge = 0; void add_edge(int from, int to, int w) { edge[cnt_edge].to = to; edge[cnt_edge].w = w; edge[cnt_edge].next = head[from]; head[from] = cnt_edge++; } memset(head, -1, sizeof head);
我糾結了好久這個函數的意思……
實際上是用鄰接表存一個圖。
cnt_edge是給每一個邊標號,從0開始。
edge[i].to 表示第i條邊指向哪個點,edge[i].next表示第i條邊的下一條邊的序號。
head[from]表示以第from為初始結點的邊的序號。
例如圖(隨便畫的= =#):
存在邊1,3 1,4 2,5 2,6 4,3 5,3 六條邊
依次調用函數add_edge之后,可以得到
edge[0].to=3; edge[0].next=-1; head[1]=0;
edge[1].to=4; edge[1].next=0; head[1]=1;
edge[2].to=5; edge[2].next=-1; head[2]=2;
edge[3].to=6; edge[3].next=2; head[2]=3;
edge[4].to=3; edge[4].next=-1; head[4]=4;
edge[5].to=3; edge[5].next=-1; head[5]=5;
用圖來表示就是:
喵。箭頭的方向該怎么畫呢。
雖然vector建圖會方便許多,但是碰到惡心的卡stl的題就gg了。所以還是要學一下鏈表建圖。
多寫幾次就很熟練了。