图论,最短路,堆优化迪杰斯特拉
Posted codemaker-li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图论,最短路,堆优化迪杰斯特拉相关的知识,希望对你有一定的参考价值。
学习了迪杰斯特拉.
类似贪心.
也有点像弗洛伊德.
上代码.
这种是规定了起始节点为1的.
1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <bits/stdc++.h> 5 6 using namespace std; 7 #define MAXN 10001 8 #define MAXM 100001 9 10 //n点m边 11 12 struct edge{ 13 int v; 14 int w; 15 int nxt; 16 }e[MAXM]; 17 int head[MAXN]; 18 int cnt; 19 20 void addedge(int x,int y,int z) { 21 e[++cnt].v=y; 22 e[cnt].w=z;//边权 23 e[cnt].nxt=head[x]; 24 head[x]=cnt; 25 } 26 int dist[MAXN]; 27 bool vis[MAXN]; 28 priority_queue< pair<int,int> > q; 29 //第一维是dist相反数,这是大根堆 30 //第二维是节点编号 31 int n,m; 32 33 34 void dijkstra () { 35 memset(dist,0x3f,sizeof(dist)); 36 memset(vis,0,sizeof(vis)); 37 dist[1]=0; 38 q.push(make_pair(0,1)); 39 while (q.size()) { 40 int x=q.top().second; 41 q.pop(); 42 if (vis[x]) continue; 43 vis[x]=1; 44 for (int i=head[x];i;i=e[i].nxt) { 45 int y=e[i].v; 46 int z=e[i].w; 47 if (dist[y]>dist[x]+z) { 48 dist[y]=dist[x]+z; 49 q.push(make_pair(-dist[y],y)); 50 } 51 } 52 } 53 } 54 55 int main () { 56 cin>>n>>m; 57 for (int i=1;i<=m;i++) { 58 int x,y,z; 59 cin>>x>>y>>z; 60 addedge(x,y,z); 61 //addedge(y,x,z); 62 } 63 dijkstra(); 64 for (int i=1;i<=n;i++) { 65 cout<<dist[i]<<" "; 66 } 67 return 0; 68 } 69 70 /* 71 5 8 72 1 2 2 73 1 3 1 74 1 5 4 75 2 3 6 76 2 4 3 77 2 5 4 78 4 5 5 79 3 5 2 80 */
其实迪杰斯特拉还可以是有起点的,
自己可以定起点,
下面就是,
这就是单元最短路,
1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <bits/stdc++.h> 5 6 using namespace std; 7 #define MAXN 10001 8 #define MAXM 100001 9 10 //n点m边 11 12 struct edge { 13 int v; 14 int w; 15 int nxt; 16 } e[MAXM]; 17 int head[MAXN]; 18 int cnt; 19 20 void addedge(int x,int y,int z) { 21 e[++cnt].v=y; 22 e[cnt].w=z;//边权 23 e[cnt].nxt=head[x]; 24 head[x]=cnt; 25 } 26 int dist[MAXN]; 27 bool vis[MAXN]; 28 priority_queue< pair<int,int> > q; 29 //第一维是dist相反数,这是大根堆 30 //第二维是节点编号 31 int n,m; 32 33 34 void dijkstra (int st) { 35 memset(dist,0x3f,sizeof(dist)); 36 memset(vis,0,sizeof(vis)); 37 dist[st]=0; 38 q.push(make_pair(0,st)); 39 while (q.size()) { 40 int x=q.top().second; 41 q.pop(); 42 if (vis[x]) continue; 43 vis[x]=1; 44 for (int i=head[x]; i; i=e[i].nxt) { 45 int y=e[i].v; 46 int z=e[i].w; 47 if (dist[y]>dist[x]+z) { 48 dist[y]=dist[x]+z; 49 q.push(make_pair(-dist[y],y)); 50 } 51 } 52 } 53 } 54 55 int main () { 56 cin>>n>>m; 57 for (int i=1; i<=m; i++) { 58 int x,y,z; 59 cin>>x>>y>>z; 60 addedge(x,y,z); 61 //addedge(y,x,z); 62 } 63 for (int i=1; i<=n; i++) { 64 dijkstra(i); 65 cout<<"以"<<i<<"为起点"<<endl; 66 for (int i=1; i<=n; i++) { 67 cout<<dist[i]<<" "; 68 } 69 cout<<endl; 70 cout<<endl; 71 } 72 73 74 return 0; 75 } 76 77 /* 78 5 8 79 1 2 2 80 1 3 1 81 1 5 4 82 2 3 6 83 2 4 3 84 2 5 4 85 4 5 5 86 3 5 2 87 */
以上是关于图论,最短路,堆优化迪杰斯特拉的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数