//============================================================================
// Name : uestcOJ_shortest_length.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
static const int MAX=20000;
//static const int MAXNUM=100;
//int dist[MAXNUM];
//int prev[MAXNUM];
//int A[MAXNUM][MAXNUM];//邻接矩阵
void Dijkstra(int v0,int n,int **A,int x)
{
bool S[n+1];
int dist[n+1];
// int prev[n+1];
for(int i=1;i<=n;i++)
{
dist[i]=*((int*)A + (n+1)*v0 + i);//A[v0][i] *((int*)A + (n+1)*v0 + i)
S[i]=false;
//if(dist[i]==MAX)
//prev[i]=-1;
//else
//prev[i]=v0;//前区节点
}
dist[v0]=0;
S[v0]=true;
S[0]=true;
for(int i=2;i<=n;i++)
{
int min=MAX;
int u=v0;
for(int j=1;j<=n;j++)
{
if((!S[j]) && dist[j]<min)
{
u=j;
min=dist[j];//找到dist[j]最小值
}
}
S[u]=true;
for(int j=1;j<=n;j++)
{
if((!S[j]) && *((int*)A + (n+1)*u + j)<MAX)
{
if(dist[u]+*((int*)A + (n+1)*u + j)<dist[j])
dist[j]=dist[u]+*((int*)A + (n+1)*u + j);
//prev[j]=u;
}
}
}
//cout<<dist[x-1];
/*for(int i=0;i<=n;i++)
{
cout<<dist[i]<<" ";
}*/
cout<<dist[x];
return;
}
int main() {
int N,M;
cin>>N>>M;
while(N!=0 && M!=0)
{ int W[N+1][N+1];
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
W[i][j]=MAX;
for(int i=0;i<M;++i)
{
int a,b,c;
cin>>a>>b>>c;
W[a][b]=c;
W[b][a]=c;
//cout<<W[a][b]<<endl;
}
Dijkstra(1,N,(int **)W,N);
cin>>N>>M;
}
return 0;
}
广度优先算法最短路径问题 Dijkstra算法
最新推荐文章于 2023-05-11 20:44:55 发布