有向無環圖(DAG)部分算法

補充圖的鏈式前向星:

參考:https://blog.csdn.net/acdreamers/article/details/16902023

總結:

u——起點
v——終點
w——權值
head[i]存放以i爲起點的最後一條邊存儲的位置
len[i]來記錄所有以i爲起點的邊在數組中的存儲長度
edge[i].next表示與第i條邊同起點的上一條邊的存儲位置
const int N = 1001;
const int M = 10001;

struct edge {
    int v, w, next;
    edge(){}
    edge(int _v, int _w, int _next) {
        v = _v;
        w = _w;
        next = _next;
    }
} e[M * 2];

int head[N], size;

void init() {
    memset(head, -1, sizeof(head));
    size = 0; //邊數
}

void insert(int u, int v, int w) {
    e[size] = edge(v, w, head[u]);
    head[u] = size++;
}

void insert2(int u, int v, int w) {
    insert(u, v, w);
    insert(v, u, w);
}

 

一、拓撲排序

/*
 * 算法描述
 * while(存在入度爲0的點){
 * 1.選擇一個入度爲0的點並將它輸出
 * 2.刪除圖中從頂點連出的所有邊
 * }
 * 循環結束
 * if(輸出頂點數小於圖中的頂點數) 圖中存在迴路,無法拓撲排序
 * else 輸出點即爲拓撲排序
 */
//鏈式前向星
int p[maxn];
int topo() {
    queue<int> q;
    for(int i = 1; i <= N; i++) {
        if(indegree[i] == 0) {
            q.push(i);
        }
    }
    while(!q.empty()) {
        int now = q.front();
        q.pop();
        for(int i = p[now]; ~i; i = e[i].next) {
            int v = e[i].v;
            indegree[v]--;
            if(indegree[v] = 0) {
                q.push(v);
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章