首页 > 代码库 > dijistra和Folyd模板
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模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。