在上周的测验中,我们要计算车票价格,让我重新温习了数据结构的两种算法
1.宽度优先搜索
使用宽度优先搜索可以找到,边权值相同的点的最短距离
2.迪杰斯特拉算法
使用这个算法可以用n^2的时间复杂度计算最短距离
模版
#include<string.h>
#include<iostream>
using namespace std;
#define N 150
typedef pair<int,int> P;
int n,m,A[N][N],d[N][N];
P pt[N*N];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int bfs(){int tt=0,hh=0;memset(d,-1,sizeof(d));d[0][0]=0;pt[0]={0,0};while(hh<=tt){auto t=pt[hh++];for(int i=0;i<4;i++){if(t.first+dx[i]>=0&&t.second+dy[i]>=0&&t.first+dx[i]<n&&t.second+dy[i]<m&&d[t.first+dx[i]][t.second+dy[i]]==-1&&A[t.first+dx[i]][t.second+dy[i]]==0){d[t.first+dx[i]][t.second+dy[i]]=d[t.first][t.second]+1;pt[++tt]={ t.first+dx[i],t.second+dy[i]};}}}return d[n-1][m-1];
}
int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){for(int j=0;j<m;j++)scanf("%d",&A[i][j]);}cout<<bfs();return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
const int N=120;
#define INF 0x3f3f3f3f
int pa[N][N],back[N][N];
int dis[N];
bool st[N];
int n,m,a,b,c;
int djstra(int b){dis[b]=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++){if(!st[j]&&(t==-1||dis[t]>dis[j])){t=j;}}st[t]=true;// if(dis[t]==INF)break;for(int j=1;j<=n;j++){if(!st[j]&&dis[j]>dis[t]+pa[t][j]){dis[j]=dis[t]+pa[t][j];}}}int ma=-1;for(int i=1;i<=n;i++){ma=max(ma,dis[i]);}return ma;
}int main(){cin>>n>>m;memset(pa,0x3f,sizeof pa);for(int i=0;i<m;i++){cin>>a>>b>>c;pa[a][b]=c;pa[b][a]=c;}int res=INF;memset(st,0,sizeof st);memset(dis,0x3f,sizeof dis);res=djstra(1);cout<<res;return 0;
}