图论的模板
这里整理一些图论的模板
最小生成树:kcruskal 算法
自剩下的未选取的边中找到最小边
如果和已选取的构成回路,则放弃
int kcruskal(){
int res=0;
int i;
sort(ed.begin,ed.end);
for(i=1;i<=ed.size();i++){
int u=ed[i].u;
int v=ed[i].v;
if(findset(u)!=findset(v)){
unite(u,v);
res+=ed[i].w;
}
}
return res;
}
单源最短路
如果存在一条从i到j的最短路径(vi……vk ,vj) vk 为vj前面的某一顶点,(vi……vk)为i到k的最短路
dijkstra 算法
void dijstra(int s) {
priority_queue<state, vector<state>, greater<state> >pq;
pq.push(state(0, s));
dist[s] = 0;
while (!pq.empty()) {
state p = pq.top();
pq.pop();
int d = p.fi, u = p.se;
if (dist[u]<d)continue;
for (int i = 0; i<G[u].size(); i++) {
int e = G[u][i];
int v = E[e].to;
if (dist[v]>dist[u] + E[e].weight; {
dis[v] = dist[u] + E[e].weight;
pq.push(state(dist[v], v);
}
}
}
}
floyd-warshall 算法
int d[max_n][max_n];
int v;
void warshall_floyd() {
for (k = 0; k < v; k++) {
for (i = 0; i < v; i++) {
for (j = 0; j < v; j++) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}