一道最短路径板子题,记录一下今天的坑点。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[205][205];
int path[205];
void dfs(int sta)
{
bool flag[205]={0};
memset(path,0x3f,sizeof(path));
for(int i=0;i<n;i++)
{
path[i]=a[sta][i];
flag[i]=0;
}
flag[sta]=1;
for(int i=1;i<n;i++){
int k=i,minVal=inf;
for(int j=0;j<n;j++){
if(!flag[j]&&minVal>path[j]){
k=j;
minVal=path[j];
}
}
if(minVal==inf)break;
flag[k]=1;
for(int j=0;j<n;j++){
if(!flag[j]&&path[k]+a[k][j]<path[j]){
path[j]=minVal+a[k][j];
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(i!=j)
a[i][j]=inf;
else
a[i][j]=0;
}
while(m--)
{
int l,r,val;
cin>>l>>r>>val;
a[l][r]=a[r][l]=min(a[l][r],val);
}
int s,t;
cin>>s>>t;
dfs(s);
if(path[t]==inf)cout<<-1<<endl;
else cout<<path[t]<<endl;
}
}
在刚刚开始的时候,我习惯于将邻接矩阵里面所有的点设为inf,之前没有仔细思考过为什么要将对角线设置为0,现在明白了。
主要是如果有数据,从(x,y)到(x,y),如此不设为0,将会是inf,直接就错误了。