補充圖的鏈式前向星:
參考: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);
}
}
}
}