dijistra和Folyd模板
Posted starry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dijistra和Folyd模板相关的知识,希望对你有一定的参考价值。
dijistra模板
1 void dijistra(int x){ 2 int pos = x; 3 for(int i = 1; i <= n; i ++){ 4 dist[i] = g[i][pos]; 5 } 6 vis[pos] = true; 7 for(int i = 1; i <= n; i ++){ 8 int mins = INF; 9 for(int j = 1; j <= n; j ++){ 10 if(!vis[j] && dist[j] < mins){ 11 pos = j; 12 mins = dist[j]; 13 } 14 } 15 vis[pos] = true; 16 for(int j = 1; j <= n; j ++){ 17 if(!vis[j] && dist[j] > dist[pos] + g[pos][j]){ 18 dist[j] = dist[pos] + g[pos][j]; 19 } 20 } 21 } 22 }
优化的dijistra模板:
1 struct edge{ 2 int to, cost; 3 }; 4 vector<edge> g[N]; 5 typedef pair<int,int> P; // first是最短距离,second是定点的编号 6 void dijistra(int s){ 7 priority_queue<P,vector<P>,greater<P> > que; 8 d[a] = 0; 9 que.push(P(0,s)); 10 while(!que.empty()){ 11 P p = que.top();que.pop(); 12 int v = p.second; 13 if(d[v] < p.first) continue; 14 for(int i = 0; i < g[v].size(); i ++){ 15 edge e = g[v][i]; 16 if(d[e.to] > d[v] + e.cost){ 17 d[e.to] = d[v] + e.cost; 18 que.push(P(d[e.to],e.to)); 19 } 20 } 21 } 22 }
Floyd模板,由于复杂度太大,很少用:
1 int d[MAX_N]d[MAX_N]; 2 int v; 3 4 void Floyd(){ 5 for(int k = 0; k < v; k ++){ 6 for(int i = 0; i < v; i ++){ 7 for(int j = 0; j < v; j ++){ 8 d[i][j] = min(d[i][j],d[i][k] + d[k][j]); 9 } 10 } 11 } 12 }
以上是关于dijistra和Folyd模板的主要内容,如果未能解决你的问题,请参考以下文章