Description
网易2021校招笔试-算法工程师(正式第二批) 网易严选建有N个自营仓分布在全国各地,标记为仓库1到N。 给定一个配货时间组(v,u,w),v为出发仓库,u为目标仓库,w为从出发仓库到目标仓库的耗时时间。 可能存在仓库间过远,无法支持调拨转货。 指定一个出发仓库K,我们需要将供应商发送到K仓库的货配送到各个仓库。 问配送到所有可到达仓库所要最短时间?如果无法全部调拨到,则返回-1.
输入格式
第一行三个正整数,由空格分割,分别表示仓库个数N,出发仓K,以及配送时间组个数M 接下来 M行,每行三个整数,由空格分割,分别表示(v,u,w)三个数,v为出发仓库,u为目标仓库,w为从出发仓库到目标仓库的耗时时间 1<=N<=30 1<=K<=N 1<=M<=130 1<=u,v<=N 1<=w<=20
输出格式
一行一个数字表示答案,配送到所有可达仓库到最短时间,如果无法送达全部仓库,输出-1。
输入样例
6 2 5 2 1 1 2 6 2 1 3 3 3 4 1 6 5 2
输出样例
5
思路记录:最短路径算法
#include<iostream>//迪杰斯特拉算法求最短路径 (无向网)
#include<cstring>
#include <iomanip>
#include <stdio.h>
#include<cmath>
#include<vector>
using namespace std;
struct node{
int arr,val;
};
int d[105],v[105],n,k,z;
vector<node> a[105];
int getmin(){
int ans,tem=99999999;
for(int i=1;i<=n;i++){
if(d[i]<tem&&v[i]==0){
tem=d[i];
ans=i;
}
}
v[ans]=1;
return ans;
}
void djstra(int tem){
memset(d,127/3,sizeof(d));
d[tem]=0;
for(int i=1;i<=n;i++){
int s=getmin();
for(int j=0;j<a[s].size();j++){
int arr=a[s][j].arr;
int val=a[s][j].val;
if(d[s]+val<d[arr]&&v[arr]==0)
d[arr]=d[s]+val;
}
}
}
int main()
{
cin>>n>>k>>z;
while(z--){
int x1,y1,z1;
cin>>x1>>y1>>z1;
a[x1].push_back({y1,z1});
}
djstra(k);
int ans=0;
for(int i=1;i<=n;i++){
if(d[i]>=9999999){
cout<<-1;
return 0;
}
if(ans<d[i])
ans=d[i];
}
cout<<ans;
return 0;
}