圖論加邊算法--鏈式向前星


很多圖論的算法都有一個函數

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了。所以還是要學一下鏈表建圖。

多寫幾次就很熟練了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM