SPFA松弛操作,注意不要记录一个cost边权,用固定的dis计算即可
注意全部入队
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
int dis[11000];
int head[11000],net[210000],to[210000],p[210000],cnt;
bool f[11000];
void add(int a,int b,int c)
{
to[++cnt]=b;
p[cnt]=c;
net[cnt]=head[a];
head[a]=cnt;
}
queue <int> dl;
void SPFA(int n)
{
for(int i=1;i<=n;i++)
dl.push(i),f[i]=1;
while(!dl.empty())
{
int x=dl.front();
dl.pop();f[x]=0;
for(int i=head[x];i;i=net[i])
{
int d=to[i];
if(dis[d]>=dis[x]+dis[p[i]])
{
dis[d]=dis[x]+dis[p[i]];
if(!f[d])
f[d]=1,dl.push(d);
}
}
}
}
int main()
{
freopen("dwarf.in","r",stdin);
freopen("dwarf.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&dis[i]);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
add(c,a,b);
}
SPFA(n);
printf("%d",dis[1]);
return 0;
}