玩一玩dijkstra

文学盲的简单粗暴!!!

dijkstra算法,就是指定一个顶点(也就是源点)到其他各个顶点间的最短路径。

下面算法大概:每次更新完一个最短边后继续从当前边的终点为起点,在去找下一条最短边,直到所有点遍历了就ok

不说那么多了,慢慢领会吧。。。

#include <cstdio>
#define inf 0x3f3f3f3f
int main(){
    int vis[100];
    int e[100][100];
    int n,m;
    int dis[100];
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
    int u,v,w;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        e[u][v]=w;
    }
    for(int i=1;i<=n;i++)
        vis[i]=0;
    for(int i=1;i<=n;i++)
        dis[i]=e[1][i];
    int minx,k;
    vis[1]=1;
     puts("");
    puts("输出初始化时的矩阵:");
     for(int i=1;i<=n;i++)
    {

         for(int j=1;j<=n;j++)
               if(e[i][j]==inf) printf("* ");
               else  printf("%d ",e[i][j]);
        puts("");
    }
     puts("");
    for(int i=1;i<=n-1;i++){
        minx=inf;
        ///先找离1号最近的顶点,注意1号顶点已标记
        for(int j=1;j<=n;j++)
        if(!vis[j]&&dis[j]<minx){
            minx=dis[j];
            k=j;
        }
        printf("minx=%d,k=%d",minx,k);
        vis[k]=1;
        ///由于已找到1号最近的顶点,然后从当前的顶点开始去找到一个顶点到当前顶点的最小边,这算法是一条一条边去找
        for(int j=1;j<=n;j++)
             if(e[k][j]<inf&&dis[j]>dis[k]+e[k][j]) dis[j]=dis[k]+e[k][j];
    puts("");
    printf("输出第%d次的矩阵:\n",i);
         for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
                if(e[i][j]==inf) printf("* ");
               else  printf("%d ",e[i][j]);
        puts("");
       }
    }
    puts("");
    printf("输出最终的矩阵:\n");
     for(int i=1;i<=n;i++)
    {

         for(int j=1;j<=n;j++)
              if(e[i][j]==inf) printf("* ");
               else  printf("%d ",e[i][j]);
        puts("");
    }
    for(int i=1;i<=n;i++)
     printf("%d ",dis[i]);
}
/*
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

输出初始化时的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

minx=1,k=2
输出第1次的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

minx=4,k=4
输出第2次的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

minx=8,k=3
输出第3次的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

minx=13,k=5
输出第4次的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

minx=17,k=6
输出第5次的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0

输出最终的矩阵:
0 1 12 * * *
* 0 9 3 * *
* * 0 * 5 *
* * 4 0 13 15
* * * * 0 4
* * * * * 0
0 1 8 4 13 17
Process returned 0 (0x0)   execution time : 18.830 s
Press any key to continue.

例题:

///poj2387无向图
#include<cstdio>
#define inf 0x3f3f3f3f
 int e[1010][1010];///定全局,不然会出错的
int main(){
     int m,n;
     while(~scanf("%d%d",&m,&n)){

            int vis[1010],dis[1010];
            int a,b,c;
            for(int i=1;i<=n;i++)
                 for(int j=1;j<=n;j++)
                      if(i==j) e[i][j]=0;
                      else e[i][j]=inf;
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&a,&b,&c);
                if(c<e[a][b])
                e[a][b]=e[b][a]=c;
            }
             for(int i=1;i<=n;i++){
                vis[i]=0;
                dis[i]=e[1][i];
             }
        int minx;
        int u;
        for(int k=1;k<=n-1;k++){
            minx=inf;
            for(int i=1;i<=n;i++)
               if(!vis[i]&&dis[i]<minx){
                  u=i;
                  minx=dis[i];
               }
          vis[u]=1;
          for(int v=1;v<=n;v++)
               if(e[u][v]<inf&&dis[v]>dis[u]+e[u][v])  dis[v]=dis[u]+e[u][v];
        }
       printf("%d\n",dis[n]);
     }
     return 0;
}

*/
发布了35 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Honeycomb_1/article/details/86605389