最短路径问题,就是迪杰斯特拉(Dijkstra)算法模板题,Dijkstra需要一个邻接矩阵,D[]数组,P[]数组,final[]数组,邻接矩阵存权值,D[]存,V0到各个端点的最短距离,final[]数组的作用是记录节点是否是最短路径之一的端点,P[]数组是记录V0到P[]数组下标节点的最短距离。
不过需要注意的是,当有更小权值输入的时候,要记录更小权值,我WA几次。。
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19369 Accepted Submission(s): 6706
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int g[250][250],final[250],d[250],n,m,i,j,begin,end,time,min,k;
while(cin>>n>>m)
{
memset(g,10005,sizeof(g));
for(i=0;i<=n;i++)
g[i][i]=0;
for(i=0;i<m;i++)
{
cin>>begin>>end>>time;
if(time<g[begin][end])
g[begin][end]=g[end][begin]=time;
}
cin>>begin>>end;
for(i=0;i<n;i++)
{
final[i]=0;
d[i]=g[begin][i];
}
final[begin]=1;
for(i=1;i<n;i++)
{
min=20000;
for(j=0;j<n;j++)
{
if(final[j]==0&&d[j]<min)
{
k=j;
min=d[j];
}
}
final[k]=1;
for(j=0;j<n;j++)
{
if(final[j]==0&&min+g[k][j]<d[j])
{
d[j]=min+g[k][j];
}
}
}
if(d[end]>10000)
cout<<"-1"<<endl;
else
cout<<d[end]<<endl;
}
}