#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int M=20010;
int t[M];
int dist[M];
struct edge{
int a,b,c;
}e[M];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=1;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
//双向边a->b
e[i].a=a;
e[i].b=b;
e[i].c=c;
//双向边b->a
e[m+1].a=b;
e[m+1].b=a;
e[m+1].c=c;
}
memset(dist,INF,sizeof dist);
dist[1]=0;
for(int k=1;k<=n;k++)//n轮操作
{
for(int i=1;i<=2*m;i++)//检查每条边
{
int u=e[i].a,v=e[i].b;//u的一个邻居点是v
int res=t[v];//隔离时间
if(v==n) res=0;//终点不用隔离
dist[v]=min(dist[v],dist[u]+e[i].c+res);//u通过v到起点的距离更短,更新
}
}
cout<<dist[n];
return 0;
}
(出差问题)Bellman_ford算法
最新推荐文章于 2025-05-27 21:52:10 发布