玩一玩dijkstra

文学盲的简单粗暴!!!

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

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

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

#include 
#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]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
#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(cdis[u]+e[u][v])  dis[v]=dis[u]+e[u][v];
        }
       printf("%d\n",dis[n]);
     }
     return 0;
}

*/

 

你可能感兴趣的:(图论)