最短路
来源:互联网 发布:中国和印度 知乎 编辑:程序博客网 时间:2024/04/30 23:52
Dijkstra。
#include <stdio.h>#include <string.h>#define CLR(a,v) memset(a,v,sizeof(a))#define min(a,b) a < b ? a : b#define N 105#define M 10005struct Vertex{int head;}V[N];struct Edge{int v,w,next;}E[M];int n,m,top,d[N];bool in[N];void Init(){CLR(in,false);CLR(d,63);CLR(V,-1);top = 0;}void Add_Edge(int u,int v,int w){E[top].v = v;E[top].w = w;E[top].next = V[u].head;V[u].head = top++;}void Dijkstra(int s){int p = s,t = n;d[s] = 0;do{ in[p] = true;for(int i=V[p].head;i!=-1;i=E[i].next){int q = E[i].v;if(!in[q]) d[q] = min(d[q],d[p]+E[i].w);}int mmin = d[0];for(int i=1;i<=n;i++)if(!in[i] && d[i] < mmin)mmin = d[i] , p = i;}while(--t > 1);}
Dijkstra + 优先队列。
#include <queue>#include <stdio.h>#include <string.h>using namespace std;#define CLR(a,v) memset(a,v,sizeof(a))#define min(a,b) a < b ? a : b#define N 105#define M 10005struct Vertex{int head;}V[N];struct Edge{int v,w,next;}E[M];struct Node{ Node(int u,int w):u(u),w(w){} int u,w; bool operator < (const Node& S)const{ return w > S.w;}};int n,m,top,d[N];bool in[N];void Init(){ CLR(in,false);CLR(d,63);CLR(V,-1);top = 0;}void Add_Edge(int u,int v,int w){E[top].v = v;E[top].w = w;E[top].next = V[u].head;V[u].head = top++;}void Dijkstra(int s){int p = s,t = n;d[s] = 0;priority_queue<Node> Q;Q.push(Node(s,0));while(!Q.empty()){ Node R = Q.top();Q.pop(); int p = R.u; if(in[p]) continue; in[p] = true;for(int i=V[p].head;i!=-1;i=E[i].next){int q = E[i].v;if(!in[q] && d[p]+E[i].w < d[q]){ d[q] = d[p]+E[i].w; Q.push(Node(q,d[q]));}}}}
Spfa。
#include <queue>#include <stdio.h>#include <string.h>using namespace std;#define CLR(a,v) memset(a,v,sizeof(a))#define min(a,b) a < b ? a : b#define N 105#define M 10005struct Vertex{int head;}V[N];struct Edge{int v,w,next;}E[M];int n,m,top,d[N];bool in[N];void Init(){ CLR(in,false);CLR(d,63);CLR(V,-1);top = 0;}void Add_Edge(int u,int v,int w){E[top].v = v;E[top].w = w;E[top].next = V[u].head;V[u].head = top++;}void Spfa(int s){ queue<int> Q; Q.push(s); d[s] = 0; in[s] = true;while(!Q.empty()){ int p = Q.front();for(int i=V[p].head;i!=-1;i=E[i].next){int q = E[i].v;if(d[p]+E[i].w < d[q]){ d[q] = d[p]+E[i].w; if(!in[q]) Q.push(q); in[q] = true;}}Q.pop();in[p] = false;}}
Floyd。
void Floyd(){ CLR(d,63); for(int i=1;i<=n;i++) d[i][i] = 0; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j] = min(d[i][j],d[i][k]+d[k][j]);}