【图】单源最短路径dijkstra

来源:互联网 发布:盒子鱼软件下载 编辑:程序博客网 时间:2024/05/29 15:08

O(n^2)级C算法,简易复习用

#include<stdio.h>#include<string.h>#include<algorithm>#include<cstdlib>using namespace std;const int INF = 1000000000;const int MAXN = 1000;int n, m;int v[MAXN], d[MAXN], G[MAXN][MAXN];int main() {  scanf("%d%d", &n, &m);  for(int i = 0; i < n; i++)    for(int j = 0; j < n; j++)      G[i][j] = INF;  for(int i = 0; i < m; i++) {    int u, v, w;    scanf("%d%d%d", &u, &v, &w);    G[u][v] = w;  }    memset(v, 0, sizeof(v));  for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF);   for(int i = 0; i < n; i++) {    int x, m = INF;    for(int y = 0; y < n; y++) if(!v[y] && d[y]<=m) m = d[x=y]; //选出所有未被遍历的点中d值最小的节点x,即到始点最短的点     v[x] = 1;//标记点x     for(int y = 0; y < n; y++) d[y] = min(d[y], d[x] + G[x][y]);//更新   }    for(int i = 0; i < n; i++)    printf("d[%d] =  %d\n", i, d[i]);  return 0;}


C++优先队列优化版

struct Edge{  int from,to,dist}struct HeapNode{  int d,u;//d是距离,u是节点号  bool operator < (const HeapNode& rhs) const  {    return d>rhs.d;  }};struct Dijkstra{  int n,m;//vertices and edges  vector<Edge> edges;  vector<int> G[maxn];  bool done[maxn];  int d[maxn];  int p[maxn];    void init(int n)  {    this->n=n;    for(int i=0;i<n;i++) G[i].clear();    edges.clear();  }    void AddEdge(int from,int to,int dist)  {    edges.push_back((Edge){from,to,dist});    m=edges.size();    G[from].push_back(m-1);  }    void dijkstra(int s)  {    priority_queue<HeapNode> Q;//有限队列优化    for(int i=0;i<n;i++) d[i]=INF;//初始化    d[s]=0;    memset(done,0,sizeof(done));    Q.push((HeapNode){0,s});//把节点压栈开始    while(!Q.empty())//当队列非空    {  HeapNode x=Q.top();//队首元素  Q.pop();//弹出  int u=x.u;   if(done[u]) continue;    done[u]=true;  for(i=0;i<G[u].size();i++)//遍历所有的边  {    Edge& e=edges[G[u][i]];    if(d[e.to]>d[u]+e.dist)    {  d[e.to]=d[u]+e.dist;  p[e.to]=G[u][i];  Q.push((HeapNode){d[e.to],e.to});}  }}  }}

汝佳的代码

#include<cstdio>#include<cstring>#include<queue>using namespace std;//terrariaconst int INF = 1000000000;const int MAXN = 1000;const int MAXM = 100000;int n, m;int first[MAXN], d[MAXN];int u[MAXM], v[MAXM], w[MAXM], next[MAXM];typedef pair<int,int> pii;int main(void){//读入及初始化   scanf("%d%d", &n, &m);  for(int i = 0; i < n; i++) first[i] = -1;  for(int e = 0; e < m; e++) {    scanf("%d%d%d", &u[e], &v[e], &w[e]);    next[e] = first[u[e]];    first[u[e]] = e;  }  priority_queue<pii, vector<pii>, greater<pii> > q;//优先队列   //bool done[MAXN];  for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF);//将所有非0值置为最大   //memset(done, 0, sizeof(done));  q.push(make_pair(d[0], 0));  while(!q.empty()) {    pii u = q.top(); q.pop();    int x = u.second;    if(x==3) printf("3 occurs, u.first=%d, d[3]=%d\n", u.first, d[3]);     if(u.first != d[x]) {printf("node #%d: first=%d, d[x]=%d, continue\n", x,u.first,d[x]); continue;}    //done[x] = true;    if(x==3) printf("3 using, d[3] = %d\n", d[3]);     for(int e = first[x]; e != -1; e = next[e]) if(d[v[e]] > d[x]+w[e]) {      d[v[e]] = d[x] + w[e];      q.push(make_pair(d[v[e]], v[e]));      printf("%d kuozhanle %d, d=%d\n",x, v[e], d[v[e]]);    }  }  for(int i = 0; i < n; i++)    printf("d[%d] = %d\n", i, d[i]);  while(1);   return 0;}


 

0 0
原创粉丝点击