文学盲的简单粗暴!!!
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;
}
*/